--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/IMPSServiceSettingsUI/Src/CWVSettingsUIDialogImp.cpp Wed Sep 01 12:31:13 2010 +0100
@@ -0,0 +1,3051 @@
+/*
+* Copyright (c) 2003 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: Dialog for setting server settings
+*
+*/
+
+
+// INCLUDE FILES
+#include "CWVSettingsUIDialogImp.h"
+#include "CWVSettingsUI.hrh"
+#include "CWVSettingsUIDefs.h"
+#include "CWVSettingsUITlsHolder.h"
+#include "CWVSettingsUIDefineNewServerDialog.h"
+#include "CWVSettingsUIServerListDialog.h"
+#include "CWVSettingsUIServerSelector.h"
+#include "WVSettingsSharedDataNG.h"
+#include "WVSettingsUIPanics.h"
+#include "CWVSettingsUIDialogTitlePaneHandler.h"
+#include "CWVSettingsUISettingItemCreator.h"
+#include "CWVSettingsUISettingItemEditor.h"
+
+#include "CIMPSSharedDataFactory.h"
+#include "MIMPSSharedData.h"
+#include "IMPSServiceSettingsUINGInternalCRKeys.h"
+#include "IMPSUIDDefs.h"
+#include "MWVSettingsCASettingsNG.h"
+#include "impscommonuidebugprint.h"
+#include "ChatNGCommonUIDs.h"
+#include <csxhelp/imng.hlp.hrh>
+
+#include <aknlists.h>
+#include <aknsettingitemlist.h>
+#include <aknsettingpage.h>
+#include <akntextsettingpage.h>
+#include <akntitle.h>
+#include <aknquerydialog.h>
+#include <cimpssapsettingsstore.h>
+#include <cimpssapsettings.h>
+#include <cwvsettingsUIng.rsg>
+#include <coemain.h>
+#include <bautils.h>
+#include <stringloader.h>
+#include <aknnotewrappers.h> // branding
+#include <hlplch.h>
+#include <featmgr.h>
+#include <cimpspresenceconnectionuing.h>
+#include <impspresenceconnectionuiconstsng.h>
+#include <AknCheckBoxSettingPage.h>
+#include <avkon.rsg>
+#include <CIMPSSAPSettingsList.h>
+//#include <shareddatakeysvariant.h>
+#include <data_caging_path_literals.hrh>
+#include <AknIconArray.h>
+#include <avkon.mbg>
+#include <PathInfo.h>
+#include <alwaysonlinemanagerclient.h>
+#include <cpengnwsessionslotid2.h>
+#include <centralrepository.h>
+#include <aknmessagequerydialog.h>
+#include <CAVariationNG.rsg>
+
+#include "CAExternalInterface.h"
+
+// The Settings have been moved to Cenrep (also retained in the Resource file),
+// so the enums for keys and central repository header is added here
+
+#include "VariantKeys.h"
+#include <centralrepository.h>
+
+
+#ifdef RD_MULTIPLE_DRIVE
+
+#include <akncommondialogsdynmem.h>
+#include <caknmemoryselectiondialogmultidrive.h>
+#include <driveinfo.h>
+const TInt KMaxLengthOfDriveInformation = 100;
+
+#endif // RD_MULTIPLE_DRIVE
+
+
+const TInt KIMFeatHighlightLoggedInServer = 32;
+
+// ================= MEMBER FUNCTIONS =======================
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CWVSettingsUIDialogImp::CWVSettingsUIDialogImp()
+ : iServerInUsePtr( NULL, 0 ),
+ iImLoginTypeEdited ( EFalse ),
+ iImLoginType ( KWVSettingsDefaultIMLoginType ),
+ iConnDaysIMPtr( NULL, 0 ),
+ iConnHoursIMPtr( NULL, 0 ),
+ iConnStartIMPtr( NULL, 0 ),
+ iConnEndIMPtr( NULL, 0 ),
+ iSchedulingSupported ( EFalse ),
+ iForcedLoginMade( EFalse ),
+ iServListDialog( NULL )
+#ifdef RD_MULTIPLE_DRIVE
+ , iMemorySelectionPtr( NULL, 0 )
+#endif // RD_MULTIPLE_DRIVE
+ , iIsOpenedTargettDlg( EFalse )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CWVSettingsUIDialogImp* CWVSettingsUIDialogImp::NewL()
+ {
+ CWVSettingsUIDialogImp* self = new ( ELeave ) CWVSettingsUIDialogImp();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::RunDialogLD
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TWVSettingsDialogReturnValue CWVSettingsUIDialogImp::RunDialogLD(
+ CIMPSSAPSettingsStore& aSAPSettingsStore,
+ MWVSettingsObserver* aObserver,
+ const TDesC& aResourceFile,
+ const TDesC& aResourceVariationFile,
+ TInt& aExitReason,
+ MWVSettingsCASettings* aCAServerSettings,
+ CWVSettingsUIDialog** aSelfPtr,
+ TBool aForcedLaunch, /*= EFalse */
+ TWVSettingsDialogType aDialogType )
+ {
+ iSAPSettingsStore = &aSAPSettingsStore;
+ iObserver = aObserver;
+ iSelfPtr = aSelfPtr;
+ iCAServerSettings = aCAServerSettings;
+ iSettingItemEditor = new ( ELeave ) CWVSettingsUISettingItemEditor();
+ iForcedLaunch = aForcedLaunch;
+
+ TFileName path = aResourceFile;
+ TFileName pathVariation = aResourceVariationFile;
+
+ if ( path.Length() == 0 )
+ {
+ Dll::FileName( path );
+ Dll::FileName( pathVariation );
+
+ IMPSCUI_DP( D_IMPSCUI_LIT( "CWVSettingsUIDialogImp::RunDialogL - got path %S" ), &path );
+
+ TDriveName drive( TParsePtrC( path ).Drive( ) );
+ path.Zero();
+ path.Append( drive );
+ path.Append( KDC_RESOURCE_FILES_DIR() );
+ path.Append( KResourceName );
+
+ TDriveName driveVar( TParsePtrC( pathVariation ).Drive( ) );
+ pathVariation.Zero();
+ pathVariation.Append( driveVar );
+ pathVariation.Append( KDC_RESOURCE_FILES_DIR() );
+ pathVariation.Append( KIMCUVariationResourceName );
+
+ IMPSCUI_DP( D_IMPSCUI_LIT( "CWVSettingsUIDialogImp::RunDialogL - Constructed path %S" ), &path );
+ }
+
+ iTlsHolder = CWVSettingsUITlsHolder::InstanceL();
+
+ if ( !( iTlsHolder->ResourceIsLoaded() ) )
+ {
+ // the resource is not loaded
+ RFs& fs = iCoeEnv->FsSession();
+
+ if ( path.Length() > 0 )
+ {
+ // when baflutils gets an empty string, it returns "C:",
+ // which breaks things
+ BaflUtils::NearestLanguageFile( fs, path );
+ }
+ if ( pathVariation.Length() > 0 )
+ {
+ // when baflutils gets an empty string, it returns "C:",
+ // which breaks things
+ BaflUtils::NearestLanguageFile( fs, pathVariation );
+
+ }
+ iResourceFileOffset = CEikonEnv::Static()->AddResourceFileL( path );
+ iResourceVariationFileOffset = CEikonEnv::Static()->AddResourceFileL( pathVariation );
+
+ iTlsHolder->ResourceLoaded();
+ }
+
+ TInt returnValue ( 0 );
+ switch ( aDialogType )
+ {
+ case EWVSettingsNormal:
+ {
+ iTitlePaneHandler = new ( ELeave ) CWVSettingsUIDialogTitlePaneHandler();
+ // add the correct menubar
+ this->ConstructL( R_WVSETTINGSVIEW_SERVSETTINGS_MENUBAR );
+ // store the titlepane text
+ iTitlePaneHandler->StoreTitlePaneTextL();
+ // create an instance of connection UI
+ iConnectionUI = CIMPSPresenceConnectionUi::NewL( EIMPSConnClientIM, iSAPSettingsStore );
+
+ returnValue = this->ExecuteLD( R_WVSETTINGSVIEW_SERVSETTINGS_DLG );
+ break;
+ }
+ case EWVSettingsDefineServer:
+ {
+ HBufC* text = CEikonEnv::Static()->AllocReadResourceLC(
+ R_WVSETTINGSVIEW_SERVERINUSE_NOSERV );
+ CAknQueryDialog* dlg = new ( ELeave ) CAknQueryDialog(
+ CAknQueryDialog::ENoTone );
+ CleanupStack::PushL( dlg );
+ dlg->SetPromptL( *text );
+ CleanupStack::Pop( dlg );
+ CleanupStack::PopAndDestroy( text );
+ TInt ret( dlg->ExecuteLD( R_DELETE_CONFIRMATION_QUERY ) );
+
+ if ( ( ret == EAknSoftkeyOk ) || ( ret == EAknSoftkeyYes ) )
+ {
+ // user accepted
+ CWVSettingsUIDialogTitlePaneHandler* titlePaneHandler =
+ new ( ELeave ) CWVSettingsUIDialogTitlePaneHandler();
+ CleanupStack::PushL( titlePaneHandler );
+ // store the titlepane text
+ titlePaneHandler->StoreTitlePaneTextL();
+ returnValue = LaunchDefineNewServerDialogL( aSAPSettingsStore,
+ *aObserver,
+ *titlePaneHandler,
+ aExitReason );
+ // restore the titlepane text
+ titlePaneHandler->RestoreTitlePaneText();
+ CleanupStack::PopAndDestroy( titlePaneHandler );
+ }
+ else
+ {
+ aExitReason = ENotSaved;
+ }
+
+ if ( iTlsHolder->OkToUnloadResource() )
+ {
+ CEikonEnv* eikonEnv = CEikonEnv::Static();
+ eikonEnv->DeleteResourceFile( iResourceFileOffset );
+ eikonEnv->DeleteResourceFile( iResourceVariationFileOffset );
+ iTlsHolder->ResourceUnLoaded();
+ }
+ delete this;
+ break;
+ }
+ default:
+ {
+ User::Leave( KErrNotSupported );
+ break;
+ }
+ }
+
+ if ( returnValue == EWVSettingsViewCmdExit )
+ {
+ return EWVSettingsViewExitCalled;
+ }
+ else
+ {
+ if ( returnValue == EAknSoftkeyExit && iForcedLoginMade )
+ {
+ // Dialog is shutdown by framework during login
+ // procedure when activating refresh view
+ aExitReason = EForcedExit;
+ }
+ return EWVSettingsViewOk;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::LaunchDefineNewServerDialogL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CWVSettingsUIDialogImp::LaunchDefineNewServerDialogL (
+ CIMPSSAPSettingsStore& aSAPSettingsStore,
+ MWVSettingsObserver& aObserver,
+ CWVSettingsUIDialogTitlePaneHandler& aTitlePaneHandler,
+ TInt& aExitReason ) const
+ {
+ TUint32 newUid( 0 );
+ CWVSettingsUIDefineNewServerDialog* defineNewServerDialog = new ( ELeave )
+ CWVSettingsUIDefineNewServerDialog(
+ aExitReason,
+ aSAPSettingsStore,
+ CWVSettingsUIDefineNewServerDialog::ENewServer,
+ aObserver,
+ aTitlePaneHandler,
+ NULL,
+ newUid,
+ iConnectionUI );
+ CleanupStack::PushL( defineNewServerDialog );
+
+ defineNewServerDialog->ConstructL( R_WVSETTINGSVIEW_DEFNEWSERVER_MENUBAR );
+ CleanupStack::Pop( defineNewServerDialog );
+ TInt returnValue = defineNewServerDialog->ExecuteLD( R_WVSETTINGSVIEW_DEFNEWSERVER_DLG );
+ return returnValue;
+ }
+
+// Destructor
+CWVSettingsUIDialogImp::~CWVSettingsUIDialogImp()
+ {
+ delete iSharedData;
+ delete iSettingsChangeNotifier;
+
+ if ( iSAPSettingsStore )
+ {
+ iSAPSettingsStore->RemoveObserver( this );
+ }
+
+ if ( iSettingItemArray )
+ {
+ iSettingItemArray->ResetAndDestroy();
+ }
+
+ delete iSettingItemArray;
+ delete iServerInUse;
+ delete iTitle;
+ if ( iTitlePaneHandler )
+ {
+ // restore the titlepane text
+ iTitlePaneHandler->RestoreTitlePaneText();
+ delete iTitlePaneHandler;
+ }
+
+ if ( iConnectionUI )
+ {
+ TBool loggedIn = EFalse;
+ TRAP_IGNORE( loggedIn = iConnectionUI->LoggedInL( EIMPSConnClientIM ) );
+
+ if ( iForcedLoginMade || loggedIn )
+ {
+ // Keep connection open
+ TRAPD( err,
+ {
+ CPEngNWSessionSlotID2* sessionSlotID =
+ iConnectionUI->GetActiveNWSessionSlotIDL( EIMPSConnClientIM );
+ CleanupStack::PushL( sessionSlotID );
+ iConnectionUI->HandleApplicationExitL( EIMPSConnClientIM,
+ EIMPSLeaveSessionOpenExit,
+ *sessionSlotID );
+ CleanupStack::PopAndDestroy( sessionSlotID );
+ } ); // TRAPD
+
+ if ( err != KErrNone )
+ {
+ CActiveScheduler::Current()->Error( err );
+ }
+ }
+ }
+
+ delete iConnectionUI;
+ delete iSettingItemEditor;
+
+ delete iConnDaysIM;
+ delete iConnHoursIM;
+ delete iConnStartIM;
+ delete iConnEndIM;
+
+ if ( iSelectedDaysIM )
+ {
+ iSelectedDaysIM->ResetAndDestroy();
+ delete iSelectedDaysIM;
+ }
+
+
+ if ( iTlsHolder )
+ {
+ if ( iTlsHolder->OkToUnloadResource() )
+ {
+ // if we leave in changeresourcefileL we have set 0 to offset
+ // and we should not try to unload the resource again
+ if ( iResourceFileOffset )
+ {
+ CEikonEnv::Static()->DeleteResourceFile( iResourceFileOffset );
+ }
+
+ if ( iResourceVariationFileOffset )
+ {
+ CEikonEnv::Static()->DeleteResourceFile( iResourceVariationFileOffset );
+ }
+ iTlsHolder->ResourceUnLoaded();
+ }
+ iTlsHolder->DestroySingletonsAndHolder();
+ }
+
+ delete iIconArray;
+ if ( iDlgLauncher && iDlgLauncher->IsActive() )
+ {
+ iDlgLauncher->Cancel();
+ }
+ delete iDlgLauncher;
+
+#ifdef RD_MULTIPLE_DRIVE
+ delete iMemorySelection;
+#endif
+ // to cancel all request when dialog closed
+ CCoeEnv* env = CCoeEnv::Static();
+ if ( env->IsActive() )
+ {
+ env->Cancel();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::UpdateServerInUseItemL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::UpdateServerInUseItemL()
+ {
+ HBufC* name = CurrentServerNameL();
+
+ // CurrentServerNameL returns NULL if there is no default SAP
+ if ( name )
+ {
+ CleanupStack::PushL( name );
+
+ // check if the server name has changed
+ if ( name->Compare( *iServerInUse ) )
+ {
+ if ( iObserver )
+ {
+ iObserver->ServerChangedL ( *name, ETrue );
+ }
+ iServerInUsePtr.Copy( name->Left( iServerInUsePtr.MaxLength() ) );
+ ChangeLoginTypeToManualL();
+ }
+ CleanupStack::PopAndDestroy( ); // name
+ }
+ else
+ {
+ iServerInUsePtr.Copy( KEmptyDesC );
+ // No default SAP, make sure that login type
+ // setting is set to manual connection
+ ChangeLoginTypeToManualL();
+ }
+
+ TInt index( EWVSettingsServerInUse );
+ if ( !iCAServerSettings )
+ {
+ // if we don't show CA settings item, we have 1 item less
+ // in the listbox -> thus -1 to the item to be loaded
+ index--;
+ }
+ iSettingItemArray->At( index )->LoadL();
+ iSettingItemArray->At( index )->UpdateListBoxTextL();
+ DrawNow();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::ChangeLoginTypeToManualL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::ChangeLoginTypeToManualL()
+ {
+ TBool refresh( EFalse );
+ if ( ( iImLoginType == EWVSettingsChatLoginAutoAlways )
+ || ( iImLoginType == EWVSettingsChatLoginAutoInHomeNW ) )
+ {
+ iImLoginTypeEdited = ETrue;
+ iImLoginType = EWVSettingsChatLoginManual;
+ // save this straight away, since default server is also saved straight away
+ StoreSettingValueL( iImLoginType, EIMPSSharedKeysIMLogin );
+ refresh = ETrue;
+ }
+ if ( refresh )
+ {
+ // Init to EFalse
+ iForcedLoginMade = EFalse;
+
+ // Show note about manual mode activation
+ HBufC* text = CEikonEnv::Static()->AllocReadResourceLC(
+ R_WVSETTINGSVIEW_MANUAL_ACTIVATED );
+
+ CAknInformationNote* note = new ( ELeave ) CAknInformationNote();
+ note->ExecuteLD( *text );
+
+ CleanupStack::PopAndDestroy( text );
+ RefreshDialogL();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::QueryNewServerL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::QueryNewServerL( TBool * aExitReason /*=NULL*/ )
+ {
+
+ HBufC* text = CEikonEnv::Static()->AllocReadResourceLC(
+ R_WVSETTINGSVIEW_SERVERINUSE_NOSERV );
+
+ CAknQueryDialog* dlg = new ( ELeave ) CAknQueryDialog(
+ CAknQueryDialog::ENoTone );
+
+ CleanupStack::PushL( dlg );
+ dlg->SetPromptL( *text );
+ CleanupStack::Pop( dlg );
+ CleanupStack::PopAndDestroy( text );
+
+ TInt ret( dlg->ExecuteLD( R_DELETE_CONFIRMATION_QUERY ) );
+
+ TWVSettingsDialogReturnValue returnValue = EWVSettingsViewOk;
+
+ if ( ( ret == EAknSoftkeyOk ) || ( ret == EAknSoftkeyYes ) )
+ {
+ TInt exitReason( 0 );
+ TUint32 newUid( 0 );
+ CWVSettingsUIDefineNewServerDialog* dlg = new ( ELeave )
+ CWVSettingsUIDefineNewServerDialog(
+ exitReason,
+ *iSAPSettingsStore,
+ CWVSettingsUIDefineNewServerDialog::ENewServer,
+ *iObserver,
+ *iTitlePaneHandler,
+ this,
+ newUid,
+ iConnectionUI );
+
+ CleanupStack::PushL( dlg );
+ dlg->ConstructL( R_WVSETTINGSVIEW_DEFNEWSERVER_MENUBAR );
+ CleanupStack::Pop( dlg );
+
+ dlg->ExecuteLD( R_WVSETTINGSVIEW_DEFNEWSERVER_DLG );
+
+
+ //if exitReason = EApplicationExit, then exit from IM application.
+ if ( exitReason == EApplicationExit )
+ {
+ *aExitReason = EFalse;
+ ProcessCommandL( EWVSettingsViewCmdExit );
+ }
+
+
+ if ( !exitReason )
+ {
+ returnValue = ExecuteServerListDialogL();
+ }
+ }
+
+ if ( returnValue == EWVSettingsViewExitCalled )
+ {
+ ProcessCommandL ( EWVSettingsViewCmdExit );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::ExecuteServerListDialogL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TWVSettingsDialogReturnValue CWVSettingsUIDialogImp::ExecuteServerListDialogL()
+ {
+ CWVSettingsUIServerListDialog* serverListDialog = new ( ELeave ) CWVSettingsUIServerListDialog(
+ *iSAPSettingsStore,
+ *iObserver,
+ *iTitlePaneHandler,
+ *this,
+ iConnectionUI );
+
+ CleanupStack::PushL( serverListDialog );
+ serverListDialog->ConstructL( R_WVSETTINGSVIEW_SERVERLIST_MENUBAR );
+ CleanupStack::Pop( serverListDialog );
+
+ iServListDialog = serverListDialog;
+ TInt returnValue = 0;
+ // Trapped to make sure iServListDialog gets
+ // nullified in case of leave
+ TRAPD( err, returnValue = serverListDialog->ExecuteLD( R_WVSETTINGSVIEW_SERVER_LIST_DLG ) );
+ iServListDialog = NULL;
+ User::LeaveIfError( err );
+
+ // this is customized return code to detect dialog shutter
+ if ( returnValue == EEikBidCancel )
+ {
+ // Dialog shutter forced the dialogs to close and dialogs are already deleted.
+ // quickly exit the dialog code.
+ return EWVSettingsViewForceExit;
+ }
+
+ UpdateServerInUseItemL();
+ RefreshTitleL();
+
+ if ( returnValue == EWVSettingsViewCmdExit )
+ {
+ return EWVSettingsViewExitCalled;
+ }
+ return EWVSettingsViewOk;
+ }
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::UpdateLoginTypesL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::UpdateLoginTypesL ()
+ {
+ // initialize as max integer, so that we know if something went wrong
+ // LoadSettingValue will return 0 if it cannot load the key
+ TInt loadedValue ( KMaxTInt );
+
+ LoadSettingValueL( loadedValue, EIMPSSharedKeysIMLogin );
+
+ SetIMLoginTypeL( loadedValue );
+
+ iSettingItemArray->At( EWVSettingsIMLoginType )->LoadL();
+ iSettingItemArray->At( EWVSettingsIMLoginType )->UpdateListBoxTextL();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::UpdateListboxL()
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::UpdateListboxL()
+ {
+ if ( iSettingItemArray )
+ {
+ TInt count ( iSettingItemArray->Count() );
+ for ( TInt i = 0; i < count; i++ )
+ {
+ iSettingItemArray->At( i )->LoadL();
+ iSettingItemArray->At( i )->UpdateListBoxTextL();
+ }
+ }
+ DrawNow();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::SetIMLoginTypeL()
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::SetIMLoginTypeL( TInt aLoadedValue )
+ {
+ if ( ( aLoadedValue > EWVSettingsChatMinLoginType )
+ && ( aLoadedValue < EWVSettingsChatMaxLoginType ) )
+ {
+ iImLoginType = aLoadedValue;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::SetConnectionDaysL( TInt aLoadedValue )
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::SetConnectionDaysL( TInt aLoadedValue,
+ CSelectionItemList& aSelectionItemList )
+ {
+ TInt index ( 0 );
+
+ if ( iStartDayOfWeek == ESunday )
+ {
+ // normally in the array monday is first, but
+ //
+ // index of the days in the array
+ index++;
+ }
+ if ( aLoadedValue & EWVSettingsMonday )
+ {
+ aSelectionItemList.At( index )->SetSelectionStatus( ETrue );
+ }
+ else
+ {
+ aSelectionItemList.At( index )->SetSelectionStatus( EFalse );
+ }
+ index++;
+
+ if ( aLoadedValue & EWVSettingsTuesday )
+ {
+ aSelectionItemList.At( index )->SetSelectionStatus( ETrue );
+ }
+ else
+ {
+ aSelectionItemList.At( index )->SetSelectionStatus( EFalse );
+ }
+ index++;
+
+ if ( aLoadedValue & EWVSettingsWednesday )
+ {
+ aSelectionItemList.At( index )->SetSelectionStatus( ETrue );
+ }
+ else
+ {
+ aSelectionItemList.At( index )->SetSelectionStatus( EFalse );
+ }
+ index++;
+
+ if ( aLoadedValue & EWVSettingsThursday )
+ {
+ aSelectionItemList.At( index )->SetSelectionStatus( ETrue );
+ }
+ else
+ {
+ aSelectionItemList.At( index )->SetSelectionStatus( EFalse );
+ }
+ index++;
+
+ if ( aLoadedValue & EWVSettingsFriday )
+ {
+ aSelectionItemList.At( index )->SetSelectionStatus( ETrue );
+ }
+ else
+ {
+ aSelectionItemList.At( index )->SetSelectionStatus( EFalse );
+ }
+ index++;
+
+ if ( aLoadedValue & EWVSettingsSaturday )
+ {
+ aSelectionItemList.At( index )->SetSelectionStatus( ETrue );
+ }
+ else
+ {
+ aSelectionItemList.At( index )->SetSelectionStatus( EFalse );
+ }
+ index++;
+
+ if ( aLoadedValue & EWVSettingsSunday )
+ {
+ if ( iStartDayOfWeek == ESunday )
+ {
+
+ aSelectionItemList.At( 0 )->SetSelectionStatus( ETrue );
+ }
+ else
+ {
+
+ aSelectionItemList.At( index )->SetSelectionStatus( ETrue );
+ }
+ }
+ else
+ {
+ if ( iStartDayOfWeek == ESunday )
+ {
+
+ aSelectionItemList.At( 0 )->SetSelectionStatus( EFalse );
+ }
+ else
+ {
+
+ aSelectionItemList.At( index )->SetSelectionStatus( EFalse );
+ }
+ }
+
+ UpdateConnectionDaysL( *iSelectedDaysIM );
+ }
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::GetConnectionDaysL( CSelectionItemList& aSelectionItemList )
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CWVSettingsUIDialogImp::GetConnectionDaysL( CSelectionItemList& aSelectionItemList )
+ {
+ TInt index ( 0 );
+
+ if ( iStartDayOfWeek == ESunday )
+ {
+ // normally in the array monday is first, but
+ //
+ // index of the days in the array
+ index++;
+ }
+
+ TInt returnValue ( 0 );
+
+ if ( aSelectionItemList.At( index )->SelectionStatus() )
+ {
+ returnValue |= EWVSettingsMonday;
+ }
+ index++;
+
+ if ( aSelectionItemList.At( index )->SelectionStatus() )
+ {
+ returnValue |= EWVSettingsTuesday;
+ }
+ index++;
+
+ if ( aSelectionItemList.At( index )->SelectionStatus() )
+ {
+ returnValue |= EWVSettingsWednesday;
+ }
+ index++;
+
+ if ( aSelectionItemList.At( index )->SelectionStatus() )
+ {
+ returnValue |= EWVSettingsThursday;
+ }
+ index++;
+
+ if ( aSelectionItemList.At( index )->SelectionStatus() )
+ {
+ returnValue |= EWVSettingsFriday;
+ }
+ index++;
+
+ if ( aSelectionItemList.At( index )->SelectionStatus() )
+ {
+ returnValue |= EWVSettingsSaturday;
+ }
+ index++;
+
+ if ( iStartDayOfWeek == ESunday )
+ {
+
+ if ( ( &aSelectionItemList )->At( 0 )->SelectionStatus() )
+ {
+ returnValue |= EWVSettingsSunday;
+ }
+ }
+ else
+ {
+ if ( aSelectionItemList.At( index )->SelectionStatus() )
+ {
+
+ returnValue |= EWVSettingsSunday;
+ }
+ }
+
+ return returnValue;
+ }
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::UpdateConnectionDaysL( CSelectionItemList& aSelectionItemList, TInt aItem )
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::UpdateConnectionDaysL( CSelectionItemList& aSelectionItemList )
+ {
+ if ( iSelectedDaysIM )
+ {
+ TBool allSelected ( ETrue );
+
+ TInt count = ( &aSelectionItemList )->Count();
+ // check if all days are selected
+ for ( TInt i = 0; i < count; i++ )
+ {
+ if ( !( &aSelectionItemList )->At( i )->SelectionStatus() )
+ {
+ allSelected = EFalse;
+ }
+ }
+
+ HBufC* text = NULL;
+
+ if ( allSelected )
+ {
+ text = StringLoader::LoadLC( R_WVSETTINGSVIEW_SETTING_PEC_CONN_ALLDAYS );
+ }
+ else
+ {
+ text = StringLoader::LoadLC( R_WVSETTINGSVIEW_SETTING_PEC_CONN_SELDAYS );
+ }
+
+ if ( text )
+ {
+ iConnDaysIMPtr.Copy( text->Left( iConnDaysIMPtr.MaxLength() ) );
+ CleanupStack::PopAndDestroy( text );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::UpdateConnectionHoursTextL( TInt aItem, TBool aAllDay )
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::UpdateConnectionHoursTextL( TBool aAllDay )
+ {
+ HBufC* text = NULL;
+ if ( aAllDay )
+ {
+ text = StringLoader::LoadLC( R_WVSETTINGSVIEW_SETTING_PEC_CONN_ALLHOURS );
+ iConnHoursIMInt = EWVSettingsAllDay;
+ iConnHoursIMPtr.Copy( text->Left( iConnHoursIMPtr.MaxLength() ) );
+ CleanupStack::PopAndDestroy( text );
+ }
+ else
+ {
+ // array granularity = 2 since there are 2 items
+ CDesCArray* noteTexts = new( ELeave ) CDesCArrayFlat( 2 );
+ CleanupStack::PushL( noteTexts );
+
+ // Arabic & Hebrew conversion if needed.
+ HBufC* startBuf = iConnStartIM->AllocLC();
+ HBufC* endBuf = iConnEndIM->AllocLC();
+
+ TPtr startPtr( startBuf->Des() );
+ TPtr endPtr( endBuf->Des() );
+
+ AknTextUtils::LanguageSpecificNumberConversion( startPtr );
+ AknTextUtils::LanguageSpecificNumberConversion( endPtr );
+
+ noteTexts->AppendL( startPtr );
+ noteTexts->AppendL( endPtr );
+
+ text = StringLoader::LoadLC( R_WVSETTINGSVIEW_SETTING_PEC_CONN_SELECTED_HOURS, *noteTexts );
+ iConnHoursIMInt = EWVSettingsBetweenHours;
+ iConnHoursIMPtr.Copy( text->Left( iConnHoursIMPtr.MaxLength() ) );
+ CleanupStack::PopAndDestroy( text );
+ CleanupStack::PopAndDestroy( 2 ); // startBuf, endBuf
+ CleanupStack::PopAndDestroy( noteTexts );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::QueryConnectionHoursL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::QueryConnectionHoursL()
+ {
+ TTime startTime;
+ TTime endTime;
+ // set the current time
+ startTime.HomeTime();
+ endTime.HomeTime();
+
+ TDateTime dateTime = startTime.DateTime();
+
+ // we can ignore the error, since if the Parse fails startTime remains in hometime
+ // get the start time for IM
+ // read the hour part of the time
+ dateTime.SetHour( iConnStartHourIM );
+ // read the minute part of the time
+ dateTime.SetMinute( iConnStartMinuteIM );
+ // set the start time
+ startTime = dateTime;
+
+ // get the end time for IM
+ // read the hour part
+ dateTime.SetHour( iConnEndHourIM );
+ // read the minute part
+ dateTime.SetMinute( iConnEndMinuteIM );
+ // set the end time
+ endTime = dateTime;
+
+ CAknMultiLineDataQueryDialog* dlg = CAknMultiLineDataQueryDialog::NewL( startTime, endTime );
+ TInt ret( dlg->ExecuteLD( R_WVSETTINGSVIEW_CONN_HOURS_QUERY ) );
+
+ if ( ( ret == EAknSoftkeyOk ) || ( ret == EAknSoftkeyYes ) )
+ {
+ // get and format the time/date string
+ HBufC* tFormat = CCoeEnv::Static()->AllocReadResourceLC(
+ R_QTN_TIME_USUAL_WITH_ZERO );
+
+ // user entered text
+ startTime.FormatL( iConnStartIMPtr, *tFormat );
+ endTime.FormatL( iConnEndIMPtr, *tFormat );
+ dateTime = startTime.DateTime();
+ iConnStartHourIM = dateTime.Hour();
+ iConnStartMinuteIM = dateTime.Minute();
+ dateTime = endTime.DateTime();
+ iConnEndHourIM = dateTime.Hour();
+ iConnEndMinuteIM = dateTime.Minute();
+ CleanupStack::PopAndDestroy( tFormat );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::RefreshTitleL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::RefreshTitleL()
+ {
+ HBufC* tempTitle = iEikonEnv->AllocReadResourceL( RSC_WVSETTINGSVIEW_SETT_NEW_SERVER );
+ delete iTitle;
+ iTitle = NULL;
+ iTitle = tempTitle;
+
+ if ( iServListDialog )
+ {
+ // Server list dialog is active, refresh title in there
+ iServListDialog->RefreshTitleL();
+ }
+ else
+ {
+ iTitlePaneHandler->SetTitlePaneTextL( *iTitle );
+ }
+ }
+
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::ProcessCommandL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::ProcessCommandL( TInt aCommand )
+ {
+ HideMenu();
+
+ switch ( aCommand )
+ {
+
+
+ case EWVSettingsViewCmdHelp:
+ {
+ HlpLauncher::LaunchHelpApplicationL( CEikonEnv::Static()->WsSession(),
+ ( CCoeEnv::Static()->AppUi() )->AppHelpContextL () );
+
+ break;
+ }
+
+ case EWVSettingsViewCmdExit:
+ {
+ TryExitL( EWVSettingsViewCmdExit );
+ break;
+ }
+
+ // Flow-through
+ case EAknSoftkeyOpen: // MSK command
+ case EAknSoftkeyEdit: // Flowthrough, MSK command
+ case EWVSettingsViewServSetChange:
+ case EWVSettingsViewServSetOpen:
+ case EWVSettingsViewSettingsEdit:
+ {
+ LaunchCorrectDialog();
+ break;
+ }
+
+ default:
+ {
+ CEikonEnv::Static()->EikAppUi()->HandleCommandL( aCommand );
+ break;
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::DynInitMenuPaneL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane )
+ {
+
+ // if we're displaying general menu and help feature is not supported..
+ if ( aResourceId == R_WVSETTINGSVIEW_GENERAL_MENU &&
+ !FeatureManager::FeatureSupported( KFeatureIdHelp ) )
+ {
+ // dimm the help menu item
+ aMenuPane->SetItemDimmed( EWVSettingsViewCmdHelp, ETrue );
+ }
+
+ if ( aResourceId == R_WVSETTINGSVIEW_SERVSETTINGS_MENUPANE )
+ {
+ TInt index = iListbox->CurrentItemIndex();
+ if ( !iCAServerSettings )
+ {
+ // if we don't show CA settings item, we have 1 item less
+ // in the listbox -> thus +1 to the index
+ index++;
+ }
+ switch ( index )
+ {
+ case EWVSettingsCASettings:
+ {
+ aMenuPane->DeleteMenuItem( EWVSettingsViewServSetChange );
+ aMenuPane->DeleteMenuItem( EWVSettingsViewSettingsEdit );
+ break;
+ }
+ case EWVSettingsServers:
+ {
+ aMenuPane->DeleteMenuItem( EWVSettingsViewServSetChange );
+ aMenuPane->DeleteMenuItem( EWVSettingsViewSettingsEdit );
+ break;
+ }
+ case EWVSettingsServerInUse:
+ {
+ aMenuPane->DeleteMenuItem( EWVSettingsViewServSetOpen );
+ aMenuPane->DeleteMenuItem( EWVSettingsViewSettingsEdit );
+ break;
+ }
+ case EWVSettingsIMLoginType:
+ case EWVSettingsIMConnDays:
+ case EWVSettingsIMConnHours:
+ {
+ aMenuPane->DeleteMenuItem( EWVSettingsViewServSetOpen );
+ aMenuPane->DeleteMenuItem( EWVSettingsViewServSetChange );
+ break;
+ }
+#ifdef RD_MULTIPLE_DRIVE
+ case EWVSettingsSaveChatsTo:
+ {
+ aMenuPane->DeleteMenuItem( EWVSettingsViewServSetOpen );
+ aMenuPane->DeleteMenuItem( EWVSettingsViewServSetChange );
+ break;
+ }
+#endif
+ default:
+ {
+ // Nothing to do if neither indexes were correct
+ User::Leave ( EIncorrectListBoxItemIndex );
+ break;
+ }
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::PreLayoutDynInitL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::PreLayoutDynInitL()
+ {
+ RefreshTitleL();
+
+ if ( iSAPSettingsStore )
+ {
+ iSAPSettingsStore->AddObserverL( this, EIMPSIMAccessGroup );
+ }
+
+ iSharedData = CIMPSSharedDataFactory::CreatePermanentKeyHandlerL( this, KIMPSServSettUid );
+
+ iSettingsChangeNotifier =
+ CIMPSSharedDataFactory::CreateTemporaryKeyHandlerL( this, KIMPSServSettNotifyUid );
+
+ // check if scheduling is supported
+ iSchedulingSupported = CWVSettingsUISettingItemCreator::SchedulingSupported();
+ if ( iSchedulingSupported )
+ {
+ TLocale* locale = new ( ELeave ) TLocale;
+ iStartDayOfWeek = locale->StartOfWeek();
+ delete locale;
+ // create an array of selected days for scheduling
+
+ // create an array of selected days. Granularity 7 since there are 7 days in a week
+ iSelectedDaysIM = new ( ELeave ) CSelectionItemList( 7 );
+ CreateSelectedDaysArrayL( *iSelectedDaysIM );
+
+ iConnDaysIM = HBufC::NewL( KWVSettingsConnDaysTextMaxLength );
+ iConnDaysIMPtr.Set( iConnDaysIM->Des() );
+
+ iConnHoursIM = HBufC::NewL( KWVSettingsConnHoursTextMaxLength );
+ iConnHoursIMPtr.Set( iConnHoursIM->Des() );
+ iConnHoursIMInt = EWVSettingsBetweenHours;
+ }
+
+#ifdef RD_MULTIPLE_DRIVE
+
+ //qtn_chat_setting_chatlogin and wvsettingsview_setting_memory_selection_type
+ iMemorySelection = HBufC::NewL( KMaxLengthOfDriveInformation );
+
+ iMemorySelectionPtr.Set( iMemorySelection->Des() );
+
+#endif // RD_MULTIPLE_DRIVE
+
+ LoadSettingsL(); //load settings from shared data and presence engine
+
+ iDlgLauncher = new ( ELeave ) CAsyncCallBack( TCallBack( LaunchDlgCallback, this ),
+ CActive::EPriorityStandard );
+
+ iServerInUse = HBufC::NewL( KWVSettingsServerNameMaxLength );
+ iServerInUsePtr.Set( iServerInUse->Des() );
+
+ HBufC* name = CurrentServerNameL();
+
+ if ( name )
+ {
+ iServerInUsePtr.Copy( ( *name ).Left( iServerInUsePtr.MaxLength() ) );
+ delete name;
+ }
+ else
+ {
+ iServerInUsePtr.Copy( KEmptyDesC );
+ }
+
+ User::LeaveIfError(
+ iSharedData->SubscribeChange( KIMPSServSettUid, EIMPSSharedKeysIMLogin ) );
+ if ( iSchedulingSupported )
+ {
+ User::LeaveIfError(
+ iSharedData->SubscribeChange( KIMPSServSettUid, EIMPSSharedKeysIMConnDays ) );
+ User::LeaveIfError(
+ iSharedData->SubscribeChange( KIMPSServSettUid, EIMPSSharedKeysIMConnStart ) );
+ User::LeaveIfError(
+ iSharedData->SubscribeChange( KIMPSServSettUid, EIMPSSharedKeysIMConnEnd ) );
+ }
+
+ iListbox =
+ static_cast< CAknSettingStyleListBox* >( Control( EWVSettingsViewControlIdServSettings ) );
+
+ TBool caSettings( EFalse );
+ if ( iCAServerSettings )
+ {
+ caSettings = ETrue;
+ }
+ iSettingItemArray =
+ CWVSettingsUISettingItemCreator::CreateSettingItemListL(
+ caSettings,
+ iServerInUsePtr,
+ iImLoginType,
+#ifdef RD_MULTIPLE_DRIVE
+ iMemorySelectionPtr,
+#endif
+ iConnDaysIMPtr,
+ iConnHoursIMPtr );
+
+ CTextListBoxModel* model = iListbox->Model();
+ model->SetItemTextArray( iSettingItemArray );
+ model->SetOwnershipType( ELbmDoesNotOwnItemArray ); // Ownership retained by us
+
+ iSettingItemArray->RecalculateVisibleIndicesL();
+ iListbox->CreateScrollBarFrameL( ETrue );
+ iListbox->ScrollBarFrame()->SetScrollBarVisibilityL(
+ CEikScrollBarFrame::EOff,
+ CEikScrollBarFrame::EAuto );
+ iListbox->HandleItemAdditionL();
+ iListbox->UpdateScrollBarsL();
+ iListbox->SetListBoxObserver( this );
+
+ if ( iForcedLaunch )
+ {
+ // Set index to login type item
+ TInt index = EWVSettingsIMLoginType;
+ if ( !iCAServerSettings )
+ {
+ // if CA setting item is not present,
+ // index needs to be decremented by one
+ index--;
+ }
+ iListbox->SetCurrentItemIndex( index );
+ }
+ UpdateCbaL();
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::CreateSelectedDaysArrayL( CSelectionItemList& aSelectionItemList )
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::CreateSelectedDaysArrayL( CSelectionItemList& aSelectionItemList )
+ {
+ // create a selectable item for each week day and append it into the array
+ CSelectableItem* selectableItem = NULL;
+
+ if ( iStartDayOfWeek == ESunday )
+ {
+ selectableItem = CreateSelectableItemLC( R_QTN_WEEK_LONG_SUNDAY );
+ ( &aSelectionItemList )->AppendL( selectableItem );
+ CleanupStack::Pop( selectableItem );
+ }
+
+ selectableItem = CreateSelectableItemLC( R_QTN_WEEK_LONG_MONDAY );
+ ( &aSelectionItemList )->AppendL( selectableItem );
+ CleanupStack::Pop( selectableItem );
+
+ selectableItem = CreateSelectableItemLC( R_QTN_WEEK_LONG_TUESDAY );
+ ( &aSelectionItemList )->AppendL( selectableItem );
+ CleanupStack::Pop( selectableItem );
+
+ selectableItem = CreateSelectableItemLC( R_QTN_WEEK_LONG_WEDNESDAY );
+ ( &aSelectionItemList )->AppendL( selectableItem );
+ CleanupStack::Pop( selectableItem );
+
+ selectableItem = CreateSelectableItemLC( R_QTN_WEEK_LONG_THURSDAY );
+ ( &aSelectionItemList )->AppendL( selectableItem );
+ CleanupStack::Pop( selectableItem );
+
+ selectableItem = CreateSelectableItemLC( R_QTN_WEEK_LONG_FRIDAY );
+ ( &aSelectionItemList )->AppendL( selectableItem );
+ CleanupStack::Pop( selectableItem );
+
+ selectableItem = CreateSelectableItemLC( R_QTN_WEEK_LONG_SATURDAY );
+ ( &aSelectionItemList )->AppendL( selectableItem );
+ CleanupStack::Pop( selectableItem );
+
+ if ( iStartDayOfWeek != ESunday )
+ {
+ selectableItem = CreateSelectableItemLC( R_QTN_WEEK_LONG_SUNDAY );
+ ( &aSelectionItemList )->AppendL( selectableItem );
+ CleanupStack::Pop( selectableItem );
+ }
+
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::CreateSelectableItemLC()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+CSelectableItem* CWVSettingsUIDialogImp::CreateSelectableItemLC( TInt aResourceId )
+ {
+ // get the text for the item
+ HBufC* text = CEikonEnv::Static()->AllocReadResourceLC( aResourceId );
+
+ // create a selectable item, which is selected by default
+ CSelectableItem* selectableItem = new( ELeave ) CSelectableItem( *text, ETrue );
+ CleanupStack::PushL( selectableItem );
+ selectableItem->ConstructL();
+ // pop the selectable item, so that we can destory text
+ CleanupStack::Pop( selectableItem );
+ CleanupStack::PopAndDestroy( text );
+
+ // push selectableItem back into the cleanup stack
+ CleanupStack::PushL( selectableItem );
+
+ return selectableItem;
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::CurrentServerNameL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+HBufC* CWVSettingsUIDialogImp::CurrentServerNameL()
+ {
+ HBufC* serverName = NULL;
+
+ CIMPSSAPSettings* sapSettings = CIMPSSAPSettings::NewLC();
+ TRAPD( err, iSAPSettingsStore->GetDefaultL( sapSettings, EIMPSIMAccessGroup ) );
+
+ if ( err == KErrNone )
+ {
+ // Code scanner warning neglected to put variable on cleanup stack (Id: 35)
+ // There is no possibility to leave in this method after this line
+ serverName = sapSettings->SAPName().AllocL(); // CSI: 35 # See above
+ }
+ else if ( err == KErrNotFound )
+ {
+ // we don't want to leave if there is no default sap
+ }
+ else
+ {
+ User::Leave( err );
+ }
+
+ CleanupStack::PopAndDestroy( sapSettings );
+
+ return serverName;
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::RefreshDialogL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::RefreshDialogL()
+ {
+ // refresh title
+ RefreshTitleL();
+
+ TBool caSettings( EFalse );
+ if ( iCAServerSettings )
+ {
+ caSettings = ETrue;
+ }
+
+
+ TBuf<KMaxLengthOfDriveInformation> drive( KWVSettingsDefaultMemoryDrive );
+
+ if ( iMemorySelectionPtr.Find( drive.Left( 2 ) ) != KErrNotFound )
+ {
+ HBufC* phoneMemoryInfo = StringLoader::LoadLC( R_QTN_CHAT_SETTINGS_PHONE_MEMORY,
+ iMemorySelectionPtr.Left( 2 ) );
+ iMemorySelectionPtr.Copy( phoneMemoryInfo->Des() );
+ CleanupStack::PopAndDestroy( phoneMemoryInfo );
+ }
+
+ // create a new setting item list
+ CAknSettingItemArray* tempSettingItemList =
+ CWVSettingsUISettingItemCreator::CreateSettingItemListL(
+ caSettings,
+ iServerInUsePtr,
+ iImLoginType,
+#ifdef RD_MULTIPLE_DRIVE
+ iMemorySelectionPtr,
+#endif
+ iConnDaysIMPtr,
+ iConnHoursIMPtr );
+
+ // delete the setting item array
+ if ( iSettingItemArray )
+ {
+ iSettingItemArray->ResetAndDestroy();
+ }
+ delete iSettingItemArray;
+ iSettingItemArray = tempSettingItemList;
+
+ CTextListBoxModel* model = iListbox->Model();
+
+ model->SetItemTextArray( iSettingItemArray );
+ model->SetOwnershipType( ELbmDoesNotOwnItemArray ); // Ownership retained by us
+
+ iSettingItemArray->RecalculateVisibleIndicesL();
+ iListbox->CreateScrollBarFrameL( ETrue );
+ iListbox->ScrollBarFrame()->SetScrollBarVisibilityL(
+ CEikScrollBarFrame::EOff,
+ CEikScrollBarFrame::EAuto );
+ iListbox->HandleItemAdditionL();
+ iListbox->UpdateScrollBarsL();
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::OfferKeyEventL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TKeyResponse CWVSettingsUIDialogImp::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType )
+ {
+
+ if ( aType == EEventKey &&
+ ( aKeyEvent.iCode == EKeyEnter || aKeyEvent.iCode == EKeyOK ) )
+ {
+ LaunchCorrectDialog();
+ return EKeyWasConsumed;
+ }
+
+ else if ( aKeyEvent.iCode == EKeyEscape )
+ {
+ TryExitL( EAknSoftkeyExit );
+ return EKeyWasConsumed;
+ }
+
+
+ else if ( aKeyEvent.iCode == EKeyPhoneSend )
+ {
+ return EKeyWasConsumed;
+ }
+
+ TKeyResponse res = iListbox->OfferKeyEventL( aKeyEvent, aType );
+ if ( res == EKeyWasConsumed )
+ {
+ UpdateCbaL();
+ }
+
+ return res;
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::CopySelectedDaysArrayL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CSelectionItemList* CWVSettingsUIDialogImp::CopySelectedDaysArrayL(
+ CSelectionItemList* aSelectedDaysArray )
+ {
+ CSelectionItemList* newSelectedDaysArray = new ( ELeave ) CSelectionItemList( 7 );
+ CleanupStack::PushL( newSelectedDaysArray );
+ CreateSelectedDaysArrayL( *newSelectedDaysArray );
+ CleanupStack::Pop( newSelectedDaysArray );
+
+ TInt count = aSelectedDaysArray->Count();
+ for ( TInt index( 0 ); index < count; index++ )
+ {
+ newSelectedDaysArray->At( index )->SetSelectionStatus(
+ aSelectedDaysArray->At( index )->SelectionStatus() );
+ }
+
+ return newSelectedDaysArray;
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::LaunchCorrectDialogL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::LaunchCorrectDialogL()
+ {
+
+ // check if we have servers
+ if ( !CheckAnyStoredServers() )
+ return;
+
+
+ TInt index = iListbox->CurrentItemIndex();
+ if ( !iCAServerSettings )
+ {
+ // if we don't show CA settings item, we have 1 item less
+ // in the listbox -> thus +1 to the index
+ index++;
+ }
+ switch ( index )
+ {
+ case EWVSettingsCASettings:
+ {
+ LaunchCASettingsL();
+ break;
+ }
+ case EWVSettingsServers: // edit server
+ {
+ TWVSettingsDialogReturnValue returnValue = ExecuteServerListDialogL();
+ if ( returnValue == EWVSettingsViewExitCalled )
+ {
+ TryExitL( EWVSettingsViewCmdExit );
+ }
+ else if ( returnValue != EWVSettingsViewForceExit )
+ {
+ DrawNow();
+ }
+ else
+ {
+ TryExitL( EAknSoftkeyCancel );
+ }
+ break;
+ }
+ case EWVSettingsServerInUse: // select server
+ {
+
+ TBool loggedIn( iConnectionUI->LoggedInL( EIMPSConnClientIM ) );
+
+ HBufC* buffer = NULL;
+ TIMPSConnectionOperation connOperation ( iConnectionUI->CurrentConnectionOperationL( buffer ) );
+ CleanupStack::PushL( buffer );
+
+ if ( loggedIn )
+ {
+ // connection active, we cannot edit this setting
+ // ask confirmation about logging out
+ CAknQueryDialog* dlg = new ( ELeave ) CAknQueryDialog( CAknQueryDialog::ENoTone );
+ CleanupStack::PushL( dlg );
+ // Set prompt
+ HBufC* text = CEikonEnv::Static()->AllocReadResourceLC(
+ R_WVSETTINGSVIEW_ERROR_ID_ACTIVE_CONNECTION );
+ dlg->SetPromptL( *text );
+ CleanupStack::PopAndDestroy( text );
+ CleanupStack::Pop( dlg );
+ TInt ret( dlg->ExecuteLD( R_ACTIVE_CONNECTION_CONFIRMATION_QUERY ) );
+
+ if ( ( ret == EAknSoftkeyOk ) || ( ret == EAknSoftkeyYes ) )
+ {
+ // user confirmed logout -> logout all open connections
+ CPEngNWSessionSlotID2* sessionSlotID =
+ iConnectionUI->GetActiveNWSessionSlotIDL( EIMPSConnClientIM );
+
+ CleanupStack::PushL( sessionSlotID );
+ User::LeaveIfError( iConnectionUI->LogoutL( *sessionSlotID ) );
+ CleanupStack::PopAndDestroy( sessionSlotID );
+ iForcedLoginMade = EFalse;
+
+ CWVSettingsUIServerSelector::ExecuteSelectionQueryLD( *iSAPSettingsStore, *this );
+ UpdateServerInUseItemL();
+ }
+ }
+ else if ( connOperation == EIMPSConnOppClientLogin )
+ {
+ // a login operation is ongoing, we cannot let the user edit the settings
+ HBufC* prompt = StringLoader::LoadLC( R_QTN_CHAT_LOGIN_ONGOING_NOTE, *buffer, iCoeEnv );
+ CAknErrorNote* dlg = new ( ELeave ) CAknErrorNote( ETrue );
+ dlg->ExecuteLD( *prompt );
+ CleanupStack::PopAndDestroy( prompt );
+ }
+ else
+ {
+ // there is no active connection, we can edit the setting
+ CWVSettingsUIServerSelector::ExecuteSelectionQueryLD( *iSAPSettingsStore, *this );
+ UpdateServerInUseItemL();
+ }
+ CleanupStack::PopAndDestroy( buffer );
+ break;
+ }
+ case EWVSettingsIMLoginType: // IM settings
+ {
+ // handle editing
+ iSettingItemArray->At( index )->EditItemL( ETrue );
+ iListbox->DrawItem( index );
+ DrawNow();
+ break;
+ }
+#ifdef RD_MULTIPLE_DRIVE
+ case EWVSettingsSaveChatsTo: // select server
+ {
+ // launch memory selection drive dialog box...
+
+ // prompt the user to save into a different drive.......
+
+ CAknMemorySelectionDialogMultiDrive* dlg = CAknMemorySelectionDialogMultiDrive::NewL(
+ ECFDDialogTypeSave,
+ 0 ,//default resource id
+ EFalse,
+ AknCommonDialogsDynMem::EMemoryTypePhone |
+ AknCommonDialogsDynMem::EMemoryTypeInternalMassStorage |
+ AknCommonDialogsDynMem::EMemoryTypeMMCExternal );
+
+
+
+ CCoeEnv* coeEnv = CCoeEnv::Static();
+
+ // Read texts from resources
+ HBufC* lskTextOk = coeEnv->AllocReadResourceLC( R_QTN_CHAT_MULTIDRIVE_OK );
+
+ dlg->SetLeftSoftkeyL( *lskTextOk );
+
+ CleanupStack::PopAndDestroy( lskTextOk );
+
+
+
+ TInt driveNo = 0;
+ TInt err = RFs::CharToDrive( iMemorySelectionPtr[0], driveNo );//converting drive letter to drive No.
+ TDriveNumber driveNumber = TDriveNumber( driveNo );
+
+ CleanupStack::PushL( dlg );
+
+ TBool ret( dlg->ExecuteL( driveNumber, NULL, NULL ) );
+
+ if ( ret )
+ {
+ TInt memoryIndex = dlg->FindIndexByDrive( driveNumber );//getting memory index corresponding to drive No. from dialog.
+
+ if ( memoryIndex >= 0 )//if drive not found, we get index -1 and GetItem throws exception.
+ {
+ dlg->GetItem( memoryIndex, iMemorySelectionPtr );//collecting drive name in iMemorySelectionPtr.
+ }
+
+ RefreshDialogL();
+
+
+ // update selecte memory drive here...
+#ifdef RD_MULTIPLE_DRIVE
+ User::LeaveIfError( iSharedData->SetStringKey( EIMPSSharedKeysMemoryDrive, iMemorySelectionPtr ) );
+#endif
+ }
+
+ CleanupStack::PopAndDestroy( dlg );
+
+ break;
+ }
+#endif
+ default:
+ {
+ // Nothing to do if neither indexes were correct
+ User::Leave( EIncorrectListBoxItemIndex );
+ break;
+ }
+ }
+ }
+
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::HandlePermanentKeyNotifyL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::HandlePermanentKeyNotifyL( const TUid aUid,
+ const TIMPSSharedKeys aKey )
+ {
+ if ( ( aUid == KIMPSServSettUid ) &&
+ ( aKey == EIMPSSharedKeysIMLogin ) )
+ {
+ UpdateLoginTypesL();
+ }
+
+ else if ( aUid == KIMPSServSettUid &&
+ ( aKey == EIMPSSharedKeysIMConnStart ) )
+ {
+ LoadConnectionHoursSettingValuesL();
+ }
+#ifdef RD_MULTIPLE_DRIVE
+ else if ( aUid == KIMPSServSettUid &&
+ ( aKey == EIMPSSharedKeysMemoryDrive ) )
+ {
+ LoadMemoryDriveSettingValueL();
+ }
+#endif
+ else if ( aUid == KIMPSServSettUid &&
+ ( aKey == EIMPSSharedKeysIMConnDays ) )
+ {
+ TInt loadedValue( KWVSettingsConnDaysAllSelected );
+ LoadSettingValueL( loadedValue, EIMPSSharedKeysIMConnDays );
+ SetConnectionDaysL( loadedValue, *iSelectedDaysIM );
+ UpdateConnectionDaysL( *iSelectedDaysIM );
+ }
+ UpdateListboxL();
+
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::HandleTemporaryKeyNotifyL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::HandleTemporaryKeyNotifyL( const TUid /* aUid */,
+ const TIMPSSharedKeys /* aKey */ )
+ {
+
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::LoadSettingsL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::LoadSettingsL()
+ {
+ // load the pec and chat login values
+ // we don't need the return value here, since
+
+ // set this to max integer so we know that we get some data
+ TInt loadedValue ( KMaxTInt );
+
+ LoadSettingValueL( loadedValue, EIMPSSharedKeysIMLogin );
+ SetIMLoginTypeL( loadedValue );
+
+ if ( iSchedulingSupported )
+ {
+ // load the connection days setting value
+ loadedValue = KWVSettingsConnDaysAllSelected;
+ LoadSettingValueL( loadedValue, EIMPSSharedKeysIMConnDays );
+ SetConnectionDaysL( loadedValue, *iSelectedDaysIM );
+
+ LoadConnectionHoursSettingValuesL();
+ }
+#ifdef RD_MULTIPLE_DRIVE
+ LoadMemoryDriveSettingValueL();
+#endif
+ }
+
+#ifdef RD_MULTIPLE_DRIVE
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::LoadMemoryDriveSettingValueL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::LoadMemoryDriveSettingValueL()
+ {
+ TInt err( iSharedData->GetStringKey( EIMPSSharedKeysMemoryDrive, iMemorySelectionPtr ) );
+
+ TInt driveNo = 0;
+ RFs::CharToDrive(iMemorySelectionPtr[0], driveNo );//converting drive letter to drive No.
+ TDriveNumber driveNumber = TDriveNumber(driveNo);
+ RFs iFs;
+ User::LeaveIfError( iFs.Connect() );
+ if ( (err == KErrNotFound ) || ( err == KErrTooBig ) || (!iFs.IsValidDrive(driveNumber)))
+ {
+ iMemorySelectionPtr.Copy( KWVSettingsDefaultMemoryDrive );
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ TUint driveStatus( 0 );
+ TBool massStorage = EFalse;
+ User::LeaveIfError( DriveInfo::GetDriveStatus( iFs, driveNumber, driveStatus ) );
+ if ( ( driveStatus & DriveInfo::EDriveInternal ) &&
+ ( driveStatus & DriveInfo::EDriveExternallyMountable ) )
+ {
+ massStorage = ETrue;
+ }
+ if ( !massStorage )
+ {
+ TVolumeInfo volInfo;
+ TInt ret( iFs.Volume( volInfo, driveNumber ) );
+ if ( ret == KErrNone )
+ {
+ int length = iMemorySelectionPtr.Length() - 3; // The lengthe of drive name and space is 3.
+ if ( iMemorySelectionPtr.Mid(3, length).Compare(volInfo.iName) ) // Check that if the labels area the same.
+ {
+ iMemorySelectionPtr.Replace(3, length, volInfo.iName);
+ User::LeaveIfError( iSharedData->SetStringKey( EIMPSSharedKeysMemoryDrive, iMemorySelectionPtr ) );
+ }
+ }
+ }
+ }
+ iFs.Close();
+ TBuf<KMaxLengthOfDriveInformation> drive( KWVSettingsDefaultMemoryDrive );
+
+ if ( iMemorySelectionPtr.Find( drive.Left( 2 ) ) != KErrNotFound )
+ {
+ HBufC* phoneMemoryInfo = StringLoader::LoadLC( R_QTN_CHAT_SETTINGS_PHONE_MEMORY,
+ iMemorySelectionPtr.Left( 2 ) );
+ iMemorySelectionPtr.Copy( phoneMemoryInfo->Des() );
+ CleanupStack::PopAndDestroy( phoneMemoryInfo );
+ }
+
+ }
+#endif
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::LoadSettingValueL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::LoadSettingValueL( TInt& aSettingValueToLoad,
+ const TIMPSSharedKeys aNameKey )
+ {
+ TInt readValue ( 0 );
+
+ TInt err( iSharedData->GetIntKey( aNameKey, readValue ) );
+ // if one of these errors occur, the value passed is not changed
+ // so we can just return
+ if ( ( err == KErrNotFound ) ||
+ ( err == KErrGeneral ) ||
+ ( err == KErrOverflow ) )
+ {
+ //load failed, let value be as it was
+ return;
+ }
+
+ //Handle other shared data reading erros by leaving
+ User::LeaveIfError( err );
+
+ aSettingValueToLoad = readValue;
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::LoadConnectionHoursSettingValuesL)
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::LoadConnectionHoursSettingValuesL()
+ {
+ // get and format the time/date string
+ HBufC* tFormat = CCoeEnv::Static()->AllocReadResourceLC(
+ R_QTN_TIME_USUAL_WITH_ZERO );
+ // IM scheduling settings
+ HBufC* tempBuf = LoadStringSettingValueL ( EIMPSSharedKeysIMConnStart, EWVSettingsConnStart );
+ delete iConnStartIM;
+ iConnStartIM = tempBuf;
+ iConnStartIMPtr.Set( iConnStartIM->Des() );
+
+ tempBuf = LoadStringSettingValueL ( EIMPSSharedKeysIMConnEnd, EWVSettingsConnEnd );
+ delete iConnEndIM;
+ iConnEndIM = tempBuf;
+ iConnEndIMPtr.Set( iConnEndIM->Des() );
+
+ // get the start time for IM
+ // read the hour part of the time
+ iConnStartHourIM = Hour( iConnStartIMPtr, KDefaultStartHour );
+ TDateTime dateTime;
+ dateTime.SetHour( iConnStartHourIM );
+ // read the minute part of the time
+ iConnStartMinuteIM = Minute( iConnStartIMPtr, KDefaultMinute );
+ dateTime.SetMinute( iConnStartMinuteIM );
+ // set the start time
+ TTime startTime = dateTime;
+
+ // get the end time for IM
+ // read the hour part
+ iConnEndHourIM = Hour( iConnEndIMPtr, KDefaultEndHour );
+ dateTime.SetHour( iConnEndHourIM );
+ // read the minute part
+ iConnEndMinuteIM = Minute( iConnEndIMPtr, KDefaultMinute );
+ dateTime.SetMinute( iConnEndMinuteIM );
+ // set the end time
+ TTime endTime = dateTime;
+
+ // user entered text
+ startTime.FormatL( iConnStartIMPtr, *tFormat );
+ endTime.FormatL( iConnEndIMPtr, *tFormat );
+
+ CleanupStack::PopAndDestroy( tFormat );
+
+ // update IM connection hours text in the listbox
+ if ( iConnStartIM && iConnEndIM )
+ {
+ if ( ( iConnHoursIMInt == EWVSettingsAllDay ) ||
+ ( !iConnStartIM->Compare( iConnEndIM->Des() ) ) )
+ {
+ UpdateConnectionHoursTextL( ETrue );
+ }
+ else
+ {
+ UpdateConnectionHoursTextL( EFalse );
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::Hour()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CWVSettingsUIDialogImp::Hour( const TDesC& aTime, TInt aDefault )
+ {
+ TPtrC hourPtr = aTime.Left( KTimeValueLength );
+
+ TLex lex( hourPtr );
+ TInt hourInt ( aDefault );
+ // we can ignore the error, if it fails we set the default
+ lex.Val( hourInt );
+ return hourInt;
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::Minute()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+TInt CWVSettingsUIDialogImp::Minute( const TDesC& aTime, TInt aDefault )
+ {
+ TPtrC minPtr = aTime.Right( KTimeValueLength );
+ TLex lex( minPtr );
+ TInt minuteInt ( aDefault );
+ // we can ignore the error, if it fails we set the default
+ lex.Val( minuteInt );
+ return minuteInt;
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::LoadStringSettingValueL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+HBufC* CWVSettingsUIDialogImp::LoadStringSettingValueL(
+ const TIMPSSharedKeys aNameKey,
+ TConnHoursSetting aSetting )
+ {
+ HBufC* buffer = HBufC::NewLC( KWVSettingsConnHoursTextMaxLength );
+
+ TPtr bufferPtr ( buffer->Des() );
+
+ TInt err( iSharedData->GetStringKey( aNameKey, bufferPtr ) );
+
+ // if one of these errors occur, the value passed is not changed
+ // so we can just return
+ if ( ( err == KErrNotFound ) ||
+ ( err == KErrTooBig ) )
+ {
+ // put the default time in the buffer
+ if ( aSetting == EWVSettingsConnStart )
+ {
+ bufferPtr.Copy( KWVSettingsDefaultConnStart );
+ }
+ else
+ {
+ bufferPtr.Copy( KWVSettingsDefaultConnEnd );
+ }
+ //load failed, let value be as it was
+ CleanupStack::Pop( buffer );
+ return buffer;
+ }
+
+ //Handle other shared data reading erros by leaving
+ User::LeaveIfError( err );
+
+ CleanupStack::Pop( buffer );
+ return buffer;
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::OkToExitL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CWVSettingsUIDialogImp::OkToExitL( TInt aKeycode )
+ {
+ if ( iIsOpenedTargettDlg )
+ {
+ return EFalse;
+ }
+ if ( aKeycode == EAknSoftkeyOptions )
+ {
+ DisplayMenuL();
+ return EFalse;
+ }
+
+ //Direct exit request causes silent exit.
+ //In this case edited settings are discarded.
+ else if ( aKeycode == EAknSoftkeyExit )
+ {
+ return ETrue;
+ }
+ else if ( aKeycode == EAknSoftkeyOpen || aKeycode == EAknSoftkeyEdit )
+ {
+ // Don't allow exit with MSK commands
+ ProcessCommandL( aKeycode );
+ return EFalse;
+ }
+
+ SaveSettingsL();
+ return ETrue;
+ }
+
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::SaveSettingsL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::SaveSettingsL()
+ {
+ //get data from editors
+ TInt count( iSettingItemArray->Count() );
+ for ( TInt i( 0 ); i < count; ++i )
+ {
+ iSettingItemArray->At( i )->StoreL();
+ }
+
+ if ( iSchedulingSupported )
+ {
+ // IM Login type settings
+ StoreSettingValueL( GetConnectionDaysL( *iSelectedDaysIM ), EIMPSSharedKeysIMConnDays );
+
+ // format the times correctly for saving (HH:MM)
+ iConnStartIMPtr.Format( KTimeFormat, iConnStartHourIM, iConnStartMinuteIM );
+
+ iConnEndIMPtr.Format( KTimeFormat, iConnEndHourIM, iConnEndMinuteIM );
+
+ StoreStringSettingValueL( *iConnStartIM, EIMPSSharedKeysIMConnStart );
+ StoreStringSettingValueL( *iConnEndIM, EIMPSSharedKeysIMConnEnd );
+
+ // set the notifier keys for schedules
+ iSettingsChangeNotifier->SetIntKey( EIMPSSharedKeysServSettScheduleChangedPEC, 0 );
+ iSettingsChangeNotifier->SetIntKey( EIMPSSharedKeysServSettScheduleChangedIM, 0 );
+ }
+
+ if ( iImLoginTypeEdited )
+ {
+ // save the IM login type
+ StoreSettingValueL( iImLoginType, EIMPSSharedKeysIMLogin );
+
+ // Start AO plugin.
+ RAlwaysOnlineClientSession session;
+
+ User::LeaveIfError( session.Connect() );
+
+ TUid uid = { KIMPSALWAYSONLINEUID3 };
+ TPckgBuf< TUid > param = uid;
+
+ if ( iImLoginType == EWVSettingsChatLoginAutoAlways ||
+ iImLoginType == EWVSettingsChatLoginAutoInHomeNW )
+ {
+ session.RelayCommandL( EServerAPIBaseCommandStart, param );
+ }
+ // Handle situation where login is ongoing and we are
+ // stopping plugin.
+ /*else
+ {
+ session.RelayCommandL( EServerAPIBaseCommandStop, param );
+ }*/
+ session.Close();
+
+ // set the notifier key for login type
+ iSettingsChangeNotifier->SetIntKey( EIMPSSharedKeysServSettLoginTypeChangedIM, 0 );
+ }
+
+ // update selecte memory drive here...
+#ifdef RD_MULTIPLE_DRIVE
+ User::LeaveIfError( iSharedData->SetStringKey( EIMPSSharedKeysMemoryDrive, iMemorySelectionPtr ) );
+#endif
+
+ }
+
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::StoreSettingValueL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::StoreSettingValueL( TInt aSettingValueToStore,
+ const TIMPSSharedKeys aNameKey )
+ {
+ __ASSERT_DEBUG( ( aSettingValueToStore != KMaxTInt ), Panic( EWVSettingsViewPanicStoreValue ) );
+
+ iSharedData->SetIntKey( aNameKey, aSettingValueToStore );
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::StoreStringSettingValueL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::StoreStringSettingValueL( const TDesC& aSettingValueToStore,
+ const TIMPSSharedKeys aNameKey )
+ {
+ User::LeaveIfError( iSharedData->SetStringKey( aNameKey, aSettingValueToStore ) );
+ }
+
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::HandleListBoxEventL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::HandleListBoxEventL( CEikListBox* /*aListBox*/,
+ TListBoxEvent aEventType )
+ {
+ switch ( aEventType )
+ {
+ case EEventEnterKeyPressed: // Fall through
+ case EEventEditingStarted:
+ case EEventItemDoubleClicked:
+ {
+ LaunchCorrectDialog();
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::ChangeResourceFileL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::ChangeResourceFileL ( const TDesC& aResourceFileName,
+ const TDesC& aResourceVariationFile )
+ {
+
+ TFileName path = aResourceFileName;
+ TFileName pathVariation = aResourceVariationFile;
+
+ TFileName connUiResFile = KNullDesC();
+ CEikonEnv* eikonEnv = CEikonEnv::Static();
+ if ( path.Length() == 0 )
+ {
+ Dll::FileName( path );
+ Dll::FileName( pathVariation );
+ TDriveName drive( TParsePtrC( path ).Drive( ) );
+ path.Zero();
+ path.Append( drive );
+ path.Append( KDC_RESOURCE_FILES_DIR() );
+ path.Append( KResourceName );
+ BaflUtils::NearestLanguageFile( eikonEnv->FsSession(), path );
+
+ TDriveName driveVar( TParsePtrC( pathVariation ).Drive( ) );
+ pathVariation.Zero();
+ pathVariation.Append( driveVar );
+ pathVariation.Append( KDC_RESOURCE_FILES_DIR() );
+ pathVariation.Append( KIMCUVariationResourceName );
+ BaflUtils::NearestLanguageFile( eikonEnv->FsSession(), pathVariation );
+ }
+ else
+ {
+ TChar backSlash( KBackSlash );
+ // Locate first backslash starting from the end of
+ // the path
+ TInt pos = path.LocateReverse( backSlash );
+ if ( pos != KErrNotFound )
+ {
+ connUiResFile.Append( path.Left( pos ) );
+ connUiResFile.Append( KDirSeparator );
+ connUiResFile.Append( KConnUiResourceName );
+ BaflUtils::NearestLanguageFile( eikonEnv->FsSession(), connUiResFile );
+ }
+ }
+
+ // test if we have enough memory to add the resource file
+ // this like this, since AddResourceFileL does
+ // not add a resourcefile with same signature twice.
+ // so we have to first delete the old one and then add the new one
+ // With this check we atleast test if there is some amount of memory
+ // for loading the resource. If we leave from AddResourceFileL the
+ // application will panic, since we have no resource file loaded at all.
+ TEntry entry;
+ User::LeaveIfError( eikonEnv->FsSession().Entry( path, entry ) );
+ TInt fileSize( entry.iSize );
+ // test if there's enough heap available, this one leaves if not and resources won't get changed
+ HBufC8* allocTest = HBufC8::NewL( fileSize );
+ delete allocTest;
+
+ // delete the current resource file
+ eikonEnv->DeleteResourceFile( iResourceFileOffset );
+ eikonEnv->DeleteResourceFile( iResourceVariationFileOffset );
+
+ // load the new resource file
+ iResourceFileOffset = 0;
+ iResourceVariationFileOffset = 0;
+
+ iResourceFileOffset = eikonEnv->AddResourceFileL( path );
+ iResourceVariationFileOffset = eikonEnv->AddResourceFileL( pathVariation );
+
+ // Change branding in iConnectionUI
+ User::LeaveIfError( RProperty::Set( KBrandingUid, KBrandingResourceKey, connUiResFile ) );
+
+ // refresh the setting items
+ LoadSettingsL();
+ RefreshDialogL();
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::GetChatLoginType()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CWVSettingsUIDialogImp::GetChatLoginType() const
+ {
+ return iImLoginType;
+ }
+
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::HandleActiveDbEvent()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::HandleSAPEvent( TSAPEvent aEvent )
+ {
+ if ( aEvent == ESAPSettingChanged )
+ {
+ // we cannot leave here, if updating fails, only wrong name shown
+ TInt ignore;
+ TRAP( ignore, UpdateServerInUseItemL() );
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::ServerListLC()
+// SAP loading
+// -----------------------------------------------------------------------------
+//
+CIMPSSAPSettingsList* CWVSettingsUIDialogImp::ServerListLC( TInt& aIndexToHighlight )
+ {
+ CIMPSSAPSettingsList* sapList = CIMPSSAPSettingsList::NewLC();
+
+ TIMPSConnectionClient client( EIMPSConnClientIM );
+ TIMPSAccessGroup accessGroup;
+ if ( client == EIMPSConnClientIM )
+ {
+ accessGroup = EIMPSIMAccessGroup;
+ }
+ else
+ {
+ accessGroup = EIMPSPECAccessGroup;
+ }
+ iSAPSettingsStore->PopulateSAPSettingsListL( *sapList, accessGroup );
+
+ // Check CR variation
+ TInt val( 0 );
+
+ TRAPD( err,
+ CRepository* rep = CRepository::NewL( KCRUidIMVariation );
+ rep->Get( KIMVariationKey, val );
+ delete rep;
+ );
+
+ if ( err != KErrNotFound && err != KErrPathNotFound )
+ {
+ // "Not found" errors are ignored, because it's ok to
+ // return zero if key is not found
+ User::LeaveIfError( err );
+ }
+
+ TBool highlightDefaultServ = ETrue;
+ TBool highlightLoggedInServ = val & KIMFeatHighlightLoggedInServer;
+
+ if ( highlightLoggedInServ )
+ {
+ highlightDefaultServ = EFalse;
+
+ CIMPSSAPSettings* sap = CIMPSSAPSettings::NewLC();
+
+ TBool isLoggedIn( EFalse );
+ if ( iConnectionUI )
+ {
+ TInt err;
+ TRAP( err, isLoggedIn =
+ iConnectionUI->LoggedInL( EIMPSConnClientIM ) );
+ }
+
+ if ( isLoggedIn )
+ {
+ CPEngNWSessionSlotID2* sessionSlotId =
+ iConnectionUI->GetActiveNWSessionSlotIDL( EIMPSConnClientIM );
+ CleanupStack::PushL( sessionSlotId );
+ iConnectionUI->GetLoggedInSapL( *sessionSlotId, *sap );
+
+ // and find our sap.. because logged in SAP has UID of zero, we must
+ // find the correct UID manually from list
+ TInt index( KErrNotFound );
+ TPtrC name( sap->SAPName() );
+ sapList->FindNameL( name, index );
+
+ if ( index != KErrNotFound )
+ {
+ // found it, update the correct sap
+ CIMPSSAPSettings* storedSap = CIMPSSAPSettings::NewLC();
+ iSAPSettingsStore->GetSAPL( sapList->UidForIndex( index ),
+ storedSap );
+
+ // we are logged in a server, and it's index was found
+ // -> highlight it
+ aIndexToHighlight = sapList->IndexForUid( storedSap->Uid() );
+
+ CleanupStack::PopAndDestroy( 3, sap ); // storedSap,
+ // sessionslot,sap
+ }
+ else
+ {
+ highlightDefaultServ = ETrue;
+ // Could not find the logged in server
+ CleanupStack::PopAndDestroy( 2, sap );
+ //,sessionSlotId, sap
+ }
+ }
+ else
+ {
+ highlightDefaultServ = ETrue;
+ CleanupStack::PopAndDestroy( sap );
+ }
+ }
+
+ if ( highlightDefaultServ )
+ {
+ //get the default server index
+ TUint32 defaultUid( KIMPSSettingsNullUid );
+
+ TRAPD( err, iSAPSettingsStore->GetDefaultL( defaultUid, accessGroup ) );
+ if ( err == KErrNone )
+ {
+ //default was defined and could retrieve a UID for it
+ //==>report its index
+ aIndexToHighlight = sapList->IndexForUid( defaultUid );
+ }
+
+ else if ( err == KErrNotFound )
+ {
+ //if there wasn't a default sap defined for some reason,
+ //return the index as KErrNotFound
+ aIndexToHighlight = KErrNotFound;
+ err = KErrNone;
+ }
+
+ //Handle other errors by leaving
+ User::LeaveIfError( err );
+ }
+
+ return sapList; //returns the ownership of sapList
+ }
+
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::LoadSapByServerListL()
+// SAP loading
+// -----------------------------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::LoadSapByServerListL( const CIMPSSAPSettingsList& aList,
+ TInt aIndexOfSelectedServer,
+ CIMPSSAPSettings& aSap )
+ {
+ if ( ( aIndexOfSelectedServer < 0 ) ||
+ ( aIndexOfSelectedServer > aList.Count() ) )
+ {
+ User::Leave( KErrArgument );
+ }
+
+ TUint32 uid = aList.UidForIndex( aIndexOfSelectedServer );
+
+ iSAPSettingsStore->GetSAPL( uid, &aSap );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::ServerToUseQueryL()
+// -----------------------------------------------------------------------------
+//
+TBool CWVSettingsUIDialogImp::ServerToUseQueryL( MDesCArray& aServers,
+ TInt aIndexToHighlight,
+ TInt& aSelectedIndex )
+ {
+ if ( aServers.MdcaCount() == 0 || aServers.MdcaCount() == 1 )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+ TRAPD( err, LoadServerIconsL( aServers ) );
+ if ( err != KErrNone )
+ {
+ // didn't manage to load bitmaps, try to show the list without them
+ delete iIconArray;
+ iIconArray = NULL;
+ }
+
+ TInt selection( -1 );
+ TInt retVal( -1 );
+ // Code scanner warning neglected to put variable on cleanup stack (Id: 35)
+ // CAknIconArray::AppendL takes ownership of the icon
+ CAknListQueryDialog* listQuery =
+ new ( ELeave ) CAknListQueryDialog( &selection ); // CSI: 35 # See above
+
+ if ( iIconArray )
+ {
+ // icon array exists, construct the query with icons
+ listQuery->PrepareLC( R_SERVER_TO_LOGIN_LISTQUERY_GRAPHIC );
+ listQuery->SetIconArrayL( iIconArray );
+ iIconArray = NULL; // listbox has the ownership of icon array
+
+ // construct formatted text array
+ TInt count( aServers.MdcaCount() );
+ CDesCArray* items = new( ELeave )CDesCArrayFlat( count );
+ CleanupStack::PushL( items );
+ for ( TInt i( 0 ); i < count; i++ )
+ {
+ TPtrC item( aServers.MdcaPoint( i ) );
+
+ // 5 is more than enough for formatted number in front of server list
+ HBufC* temp = HBufC::NewLC( item.Length() + KTabulator().Length() + 5 );
+ TPtr tempPtr( temp->Des() );
+ tempPtr.Num( i );
+ tempPtr.Append( KTabulator );
+ tempPtr.Append( item );
+
+ items->AppendL( tempPtr );
+ CleanupStack::PopAndDestroy( temp );
+ }
+
+ listQuery->SetItemTextArray( items );
+ listQuery->SetOwnershipType( ELbmOwnsItemArray );
+ CleanupStack::Pop( items ); // listbox model owns the item array
+ }
+ else
+ {
+ // icon array doesn't exist, construct the query without icons
+ listQuery->PrepareLC( R_SERVER_TO_LOGIN_LISTQUERY );
+
+ listQuery->SetItemTextArray( &aServers );
+ listQuery->SetOwnershipType( ELbmDoesNotOwnItemArray ); // listbox model doesn't own the item array
+ }
+
+ //check is the index to highlight on the range...
+ if ( ( aIndexToHighlight > 0 ) && ( aIndexToHighlight < aServers.MdcaCount() ) )
+ {
+ listQuery->ListBox()->SetCurrentItemIndex( aIndexToHighlight );
+ }
+
+ retVal = listQuery->RunLD(); //execute the selection
+
+
+ // if selection made and not cancelled
+ if ( ( selection >= 0 ) && ( retVal != 0 ) )
+ {
+ aSelectedIndex = selection;
+ return ETrue;
+ }
+
+
+ return EFalse;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::LoadServerIconsL()
+// -----------------------------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::LoadServerIconsL( MDesCArray& aServers )
+ {
+ TInt count( aServers.MdcaCount() );
+ __ASSERT_DEBUG( count > 0, User::Panic( KIMPSConnUi_PanicCat, KErrGeneral ) );
+ iIconArray = new( ELeave )CAknIconArray( count );
+
+ // load icons
+ TBool allEmpty( ETrue );
+ HBufC* pathBuf = HBufC::NewLC( KMaxFileName );
+ TPtr path( pathBuf->Des() );
+
+ CFbsBitmap* bitmap = NULL;
+ CFbsBitmap* mask = NULL;
+
+ for ( TInt i( 0 ); i < count; i++ )
+ {
+ if ( !ConstructCompletePathAndCheck( path, KModuleId,
+ aServers.MdcaPoint( i ), KBitmapFileServerList ) )
+ {
+ // not found, use empty
+ AknIconUtils::CreateIconLC( bitmap, mask, AknIconUtils::AvkonIconFileName(),
+ EMbmAvkonQgn_prop_empty, EMbmAvkonQgn_prop_empty_mask );
+ CleanupStack::Pop( 2 ); // bitmap, mask
+ // Code scanner warning neglected to put variable on cleanup stack (Id: 35)
+ // CAknIconArray::AppendL takes ownership of the icon
+ CGulIcon* gulIcon = CGulIcon::NewL( bitmap, mask ); // CSI: 35 # See above
+ iIconArray->AppendL( gulIcon );
+ }
+ else
+ {
+ // load the icon that was found
+ AknIconUtils::CreateIconLC( bitmap, mask, path, 0, 1 );
+ CleanupStack::Pop( 2 ); // bitmap, mask
+ // Code scanner warning neglected to put variable on cleanup stack (Id: 35)
+ // CAknIconArray::AppendL takes ownership of the icon
+ CGulIcon* gulIcon = CGulIcon::NewL( bitmap, mask ); // CSI: 35 # See above
+ iIconArray->AppendL( gulIcon );
+ allEmpty = EFalse;
+ }
+ }
+ CleanupStack::PopAndDestroy( pathBuf );
+
+ if ( allEmpty )
+ {
+ // every icon is empty, delete whole array and show list without icons
+ delete iIconArray;
+ iIconArray = NULL;
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::ConstructCompletePathAndCheck
+// -----------------------------------------------------------------------------
+//
+TBool CWVSettingsUIDialogImp::ConstructCompletePathAndCheck( TDes& aResult,
+ const TDesC& aModuleId,
+ const TDesC& aAlternative,
+ const TDesC& aFileName )
+ {
+ // Construct full path for wanted resource
+ // MMC drive letter must be here to make sure that TFindFile searches first
+ // MMC for the correct brand
+ MMCDrive( aResult );
+ aResult.Append( KRelativeBrandPath() );
+ aResult.Append( aModuleId );
+ aResult.Append( KDirSeparator );
+ aResult.Append( aAlternative );
+ aResult.Append( KDirSeparator );
+ aResult.Append( aFileName );
+
+ // Find the actual file
+ TFindFile fileFinder( CEikonEnv::Static()->FsSession() );
+ TInt err( fileFinder.FindByDir( aFileName, aResult ) );
+
+ // If file was found, then take the first appearance of it
+ // (order is correct aready)
+ if ( err == KErrNone )
+ {
+ aResult.Zero();
+ aResult.Append( fileFinder.File() );
+ }
+
+#ifdef _DEBUG
+ RDebug::Print( _L( "ConstructCompletePathAndCheck, TFindFile returned %d for %S" ), err, &aResult );
+#endif
+
+ // return was the file found or not
+ return err == KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::MMCDrive
+// -----------------------------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::MMCDrive( TDes& aDrive ) const
+ {
+ TParsePtrC mmc( PathInfo::MemoryCardRootPath() );
+ aDrive.Zero();
+ aDrive.Append( mmc.Drive() );
+ }
+
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::UpdateCbaL
+// -----------------------------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::UpdateCbaL()
+ {
+ TInt index = iListbox->CurrentItemIndex();
+
+ if ( !iCAServerSettings )
+ {
+ // If we don't show CA settings item, we have 1 item less
+ // in the listbox -> thus +1 to the index
+ index++;
+ }
+
+ TInt cbaRes = R_WVSETTINGSVIEW_SOFTKEYS_OPTIONS_BACK__CHANGE;
+ switch ( index )
+ {
+ case EWVSettingsCASettings: // Flowthrough
+ case EWVSettingsServers:
+ {
+ cbaRes = R_WVSETTINGSVIEW_SOFTKEYS_OPTIONS_BACK__OPEN;
+ break;
+ }
+ case EWVSettingsServerInUse:
+ {
+ // Needs cmd id open
+ cbaRes = R_WVSETTINGSVIEW_SOFTKEYS_OPTIONS_BACK__CHANGE2;
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+ ButtonGroupContainer().SetCommandSetL( cbaRes );
+ ButtonGroupContainer().DrawNow();
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::LaunchCASettingsL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::LaunchCASettingsL()
+ {
+
+ // check if we have servers
+ if ( !CheckAnyStoredServers() )
+ return;
+
+
+ CIMPSSAPSettings* sapSettings = CIMPSSAPSettings::NewLC();
+
+ TInt indexToHiglight = KErrNotFound; //UI handles this by higlighting the first
+ TInt selection = KErrNotFound;
+ TInt retStatus = KErrNone;
+
+ CIMPSSAPSettingsList* servers = ServerListLC( indexToHiglight );
+ if ( servers->MdcaCount() == 0 )
+ {
+ //No SAPs at all
+ retStatus = KErrArgument;
+ }
+
+ else if ( servers->MdcaCount() == 1 )
+ {
+ //one SAP -> use it
+ LoadSapByServerListL( *servers, 0, *sapSettings ); //one SAP --> its index is zero
+ retStatus = KErrNone;
+ }
+
+ else
+ {
+ if ( ServerToUseQueryL( *servers,
+ indexToHiglight,
+ selection ) )
+ {
+ //load sap according the user selection
+ LoadSapByServerListL( *servers, selection, *sapSettings );
+ retStatus = KErrNone;
+ }
+
+ else
+ {
+ //User declined the query
+ retStatus = KErrCancel;
+ }
+ }
+
+ CleanupStack::PopAndDestroy( servers ); //servers
+ if ( retStatus == KErrNone )
+ {
+ HBufC* oldServer = NULL;
+ MWVSettingsObserver* observer = iObserver;
+ if ( iObserver )
+ {
+ // iObserver might not exist if we didn't get here through application settings
+ // update previous server name
+ oldServer = iObserver->CurrentServerNameLC();
+ // load resource branding for this server (settings contain branded items)
+ HBufC* newServer = sapSettings->SAPName().AllocLC();
+ iObserver->ServerChangedL( *newServer );
+ CleanupStack::PopAndDestroy( newServer );
+ }
+ CWVSettingsUIDialog** selfPtr = iSelfPtr;
+
+ TInt retVal = iCAServerSettings->LaunchSettingsL( *sapSettings );
+
+ if ( retVal == EAknSoftkeyExit && selfPtr )
+ {
+ *selfPtr = NULL;
+ }
+ if ( observer )
+ {
+ observer->ServerChangedL( *oldServer );
+ CleanupStack::PopAndDestroy( oldServer );
+ }
+
+ if ( retVal != EAknSoftkeyExit )
+ {
+ RefreshTitleL();
+ }
+ }
+ CleanupStack::PopAndDestroy( sapSettings );
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::ActivateCurrentItemL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::ActivateCurrentItemL()
+ {
+ TInt index = iListbox->CurrentItemIndex();
+ TInt settingItem = index;
+ TInt oldLoginType = iImLoginType;
+ if ( !iCAServerSettings )
+ {
+ // if we don't show CA settings item, we have 1 item less
+ // in the listbox -> thus +1 to the index
+ settingItem++;
+ }
+ switch ( settingItem )
+ {
+ case EWVSettingsCASettings:
+ {
+ LaunchCASettingsL();
+ break;
+ }
+ case EWVSettingsServers: // Fall through
+ case EWVSettingsServerInUse:
+#ifdef RD_MULTIPLE_DRIVE
+ case EWVSettingsSaveChatsTo:
+#endif
+ {
+ LaunchCorrectDialogL();
+ break;
+ }
+ default:
+ {
+
+ // check if we have servers
+ if ( !CheckAnyStoredServers() )
+ return;
+
+ TBool cancelled ( ETrue );
+ TBool connHoursIMEdited( EFalse );
+
+ // copy the selected days arrays
+ CSelectionItemList* newSelectedDaysIM = CopySelectedDaysArrayL( iSelectedDaysIM );
+ CleanupStack::PushL( newSelectedDaysIM );
+ iSettingItemEditor->EditSettingItemL( ETrue,
+ index,
+ *iSettingItemArray,
+ *iSAPSettingsStore,
+ iImLoginType,
+ iImLoginTypeEdited,
+ newSelectedDaysIM,
+ iConnHoursIMInt,
+ connHoursIMEdited,
+ cancelled,
+ settingItem,
+ iConnectionUI,
+ &iForcedLoginMade );
+ CleanupStack::Pop( newSelectedDaysIM );
+
+ if ( iImLoginTypeEdited )
+ {
+ // Save IM login type right away to avoid always online queries
+ // to be shown in chat ui side and to keep value correct if user
+ // decides to do something that causes ChangeResourceFileL to be called
+ // before exiting settings dialog.
+ StoreSettingValueL( iImLoginType, EIMPSSharedKeysIMLogin );
+ }
+ if ( iForcedLoginMade )
+ {
+ // Set P&S flag to indicate forced login done
+ TInt err = RProperty::Define( KBrandingUid,
+ KForcedLoginKey,
+ RProperty::EInt,
+ KIMPSPubSubReadPolicy, KIMPSPubSubWritePolicy );
+ if ( err != KErrAlreadyExists )
+ {
+ // Ignore KErrAlreadyExists errors
+ User::LeaveIfError( err );
+ }
+ err = RProperty::Set( KBrandingUid, KForcedLoginKey, ETrue );
+ User::LeaveIfError( err );
+ }
+ else
+ {
+ // Clear flag just to be sure
+ TInt err = RProperty::Set( KBrandingUid, KForcedLoginKey, EFalse );
+ if ( err != KErrNotFound )
+ {
+ // Ignore KErrNotFound
+ User::LeaveIfError( err );
+ }
+ }
+
+ if ( iSchedulingSupported )
+ {
+ if ( !cancelled )
+ {
+ // not cancelled -> take the new selected days arrays into use
+ iSelectedDaysIM->ResetAndDestroy();
+ delete iSelectedDaysIM;
+ iSelectedDaysIM = newSelectedDaysIM;
+ newSelectedDaysIM = NULL;
+
+ UpdateConnectionDaysL( *iSelectedDaysIM );
+
+ if ( connHoursIMEdited )
+ {
+ // the IM connection hours item has been edited
+ QueryConnectionHoursL();
+ }
+
+ // update IM connection hours text in the listbox
+ if ( iConnStartIM && iConnEndIM )
+ {
+ if ( ( iConnHoursIMInt == EWVSettingsAllDay )
+ || ( !iConnStartIM->Compare( iConnEndIM->Des() ) ) )
+ {
+ UpdateConnectionHoursTextL( ETrue );
+ }
+ else
+ {
+ UpdateConnectionHoursTextL( EFalse );
+ }
+ }
+ }
+ }
+
+ if ( newSelectedDaysIM )
+ {
+ newSelectedDaysIM->ResetAndDestroy();
+ delete newSelectedDaysIM;
+ }
+
+ iSettingItemArray->At( index )->LoadL();
+ iSettingItemArray->At( index )->UpdateListBoxTextL();
+
+ if ( iImLoginTypeEdited )
+ {
+ // If changed to something else than manual
+ // show warning if variated so
+ if ( iImLoginType != EWVSettingsChatLoginManual &&
+ ( oldLoginType != iImLoginType ) )
+ {
+ // Check variation about password saving warning
+ TBool showWarning = IntResourceValueL( RSC_CHAT_VARIATION_IMPSCU_SAVE_PW_WARNING );
+
+ if ( showWarning )
+ {
+ CCoeEnv* coeEnv = CCoeEnv::Static();
+
+ // Read texts from resources
+ HBufC* warningText = coeEnv->AllocReadResourceLC(
+ R_CHAT_SAVE_PW_WARNING );
+ HBufC* warningHeading = coeEnv->AllocReadResourceLC(
+ R_CHAT_SAVE_PW_WARNING_HEADING );
+
+ // Show warning with message query dialog
+ // CodeScanner warning ignored because CS does not
+ // notice that PrepareLC puts the dialog to cleanupstack
+ CAknMessageQueryDialog* dlg = new ( ELeave ) CAknMessageQueryDialog(); // CSI: 35 # See comment above
+ dlg->PrepareLC( R_WVSETTINGSVIEW_MESSAGE_QUERY_DIALOG );
+ dlg->QueryHeading()->SetTextL( *warningHeading );
+ dlg->SetMessageTextL( *warningText );
+ dlg->RunLD();
+
+ CleanupStack::PopAndDestroy( 2, warningText );
+ }
+ }
+ RefreshDialogL();
+ }
+
+ DrawNow();
+ break;
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::LaunchDlgCallback()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CWVSettingsUIDialogImp::LaunchDlgCallback( TAny* aDlg )
+ {
+ CWVSettingsUIDialogImp* dlg = static_cast<CWVSettingsUIDialogImp*>( aDlg );
+
+ dlg->SetTargetDlgFlag( ETrue );
+ TRAP_IGNORE( dlg->ActivateCurrentItemL() );
+ dlg->SetTargetDlgFlag( EFalse );
+ return EFalse;
+ }
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::LaunchCorrectDialog()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::LaunchCorrectDialog()
+ {
+
+ if ( GetTargetDlgFlag() )
+ {
+ return;
+ }
+
+ if ( !iDlgLauncher->IsActive() )
+ {
+ iDlgLauncher->Call();
+ }
+ }
+
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::SetTargetDlgFlag()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CWVSettingsUIDialogImp::SetTargetDlgFlag( TBool aFlag )
+ {
+ iIsOpenedTargettDlg = aFlag;
+ }
+
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::SetTargetDlgFlag()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CWVSettingsUIDialogImp::GetTargetDlgFlag()
+ {
+ return iIsOpenedTargettDlg;
+ }
+
+
+// ---------------------------------------------------------
+// CWVSettingsUIDialogImp::CheckAnyStoredServers()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CWVSettingsUIDialogImp::CheckAnyStoredServers()
+ {
+ if ( iSAPSettingsStore->SAPCountL( EIMPSIMAccessGroup ) == 0 )
+ {
+
+ //exitReason indicate UpdateServerInUseItemL() is required to call or not.
+ TBool exitReason = ETrue;
+ QueryNewServerL( &exitReason );
+ if ( exitReason )
+ {
+ UpdateServerInUseItemL();
+ }
+
+ return EFalse;
+ }
+ else
+ return ETrue;
+ }
+// -----------------------------------------------------------------------------
+// CWVSettingsUIDialogImp::IntResourceValueL()
+// -----------------------------------------------------------------------------
+//
+TInt CWVSettingsUIDialogImp::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 )
+ {
+
+ TResourceReader reader;
+
+ aResourceId = aResourceId + RSC_CRRSS_CHAT_VARIATION_IMPSCU_START_ID;
+
+ CCoeEnv::Static()->CreateResourceReaderLC(
+ reader,
+ aResourceId );
+ val = reader.ReadInt32();
+ CleanupStack::PopAndDestroy(); // reader
+
+ }
+
+ return val;
+
+ }
+
+
+/**
+* CWVSettingsUI panic handler
+* @param aReason The reason for panic.
+*/
+GLDEF_C void Panic( TWVSettingsViewPanicReason aReason )
+ {
+ User::Panic( KPanicText, aReason );
+ }
+
+
+/**
+ * Help key support - GetHelpContext is called by the framework on
+ * event EAknCmdHelp
+ * --------------------------------------------------------------------------------
+ * CWVSettingsUIDefineNewServerDialog::GetHelpContext
+ * @param aContext The context dependent on the current view is passed by the framework.
+ */
+void CWVSettingsUIDialogImp::GetHelpContext( TCoeHelpContext& aContext ) const
+ {
+ aContext.iMajor = KUidChatClient;
+ aContext.iContext = KIMNG_HLP_SETTINGS ;
+ }
+void CWVSettingsUIDialogImp::ChangeToManualL()
+ {
+ ChangeLoginTypeToManualL();
+ }
+// End of File