--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/wvuiave/AppSrc/CCAAppSettingsDialog.cpp Wed Sep 01 12:31:13 2010 +0100
@@ -0,0 +1,1083 @@
+/*
+* Copyright (c) 2006 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 viewing and setting application settings
+ *
+*/
+
+
+#include "ImpsCSPAllErrors.h"
+// INCLUDE FILES
+//#include "CCAAppSettingsSAPExt.h"
+#include "CCAStatusPaneHandler.h"
+#include "chatngclient.hrh"
+#include "ChatDefinitions.h"
+#include "ChatDebugPrint.h"
+#include "CCAAppUi.h"
+#include "IMUtils.h"
+#include "IMDialogUtils.h"
+
+#include "CCAUISessionManager.h"
+#include "CCAToneSettingItem.h"
+#include "IMPRivateCRKeys.h"
+#include "imvariant.hrh"
+#include "impsbuilddefinitions.h"
+
+#include "CCACommandManagerFactory.h"
+#include "CCACommandManager.h"
+#include "MCAProcessManager.h"
+#include "MCACommand.h"
+#include "MCASettingsCommand.h"
+#include "MCAUiSettingsDialogCmdCB.h"
+#include "MCASettingSapExt.h"
+#include "MCASettingsPC.h"
+#include "CCAAppSettingsDialog.h"
+
+#include <AknColourSelectionGrid.h>
+#include <csxhelp/imng.hlp.hrh>
+#include <FeatMgr.h>
+#include <aknlists.h>
+#include <aknsettingitemlist.h>
+#include <akntextsettingpage.h>
+#include <ChatNG.rsg>
+#include <centralrepository.h>
+
+#include <hlplch.h>
+
+#include "CCAColourSettingItem.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"
+#ifdef IMPS_CONTACT_FETCH_BACKGROUND
+#include "ccasyncchecker.h"
+#endif // IMPS_CONTACT_FETCH_BACKGROUND
+
+#if defined( IMPS_CONTACT_FETCH_BACKGROUND ) || defined( RD_SETTINGS_FACELIFT )
+#include <cimpssapsettings.h>
+#endif // defined( IMPS_CONTACT_FETCH_BACKGROUND ) || defined( RD_SETTINGS_FACELIFT )
+
+
+//CONSTANTS
+const TInt KMessageFlowMin = 1; //Min message flow value
+const TInt KMessageFlowNormal = 2; //Normal message flow
+const TInt KMessageFlowMax = 3; //Max message flow value
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CCAAppSettingsDialog::CCAAppSettingsDialog( CCAStatusPaneHandler& aTitleBar,
+ MCASettingsPC& aSettingsPC,
+ CCAUISessionManager& aUISessionManager,
+ CIMPSSAPSettings* aServer )
+ : iTitlePane( &aTitleBar ), iUISessionManager( &aUISessionManager ),
+ iDefaultNick( EFalse ), iToneFileNamePtr( NULL, 0 ), iToneFileInUse( EFalse ),
+ iSettingsPC( &aSettingsPC ), iServer( aServer ), iSavingFlag( EFalse )
+ {
+ }
+
+// Destructor
+CCAAppSettingsDialog::~CCAAppSettingsDialog()
+ {
+ if ( iSettingItemArray )
+ {
+ iSettingItemArray->ResetAndDestroy();
+ }
+
+ delete iSettingItemArray;
+ delete iDefaultNickName;
+ delete iOldDefaultNickName;
+
+ delete iToneFileName;
+ // delete iSAPExtension;
+
+ delete iAsyncCallBack;
+
+ delete iCenRep;
+ delete iCommandSetings;
+
+ CCoeEnv* env = CCoeEnv::Static();
+ if ( env->IsActive() )
+ {
+ env->Cancel();
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::ProcessCommandL
+// Command handler
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppSettingsDialog::ProcessCommandL( TInt aCommand )
+ {
+ HideMenu();
+
+ if ( iSavingFlag )
+ {
+ return;
+ }
+
+ switch ( aCommand )
+ {
+ case EAknSoftkeyEdit: // Flowthrough, MSK command
+ case EChatClientAppSetChange:
+ {
+ SetIsTargetDialogOpened( ETrue );
+
+ CEikListBox* listBox = static_cast< CEikListBox* >(
+ Control( EChatClientControlIdAppSettings ) );
+ HandleListBoxEventL( listBox, EEventEditingStarted );
+ break;
+ }
+
+ case EChatClientCmdExit:
+ {
+ TryExitL( EAknSoftkeyExit );
+ break;
+ }
+ case EChatClientCmdHelp:
+ {
+ HlpLauncher::LaunchHelpApplicationL( CEikonEnv::Static()->WsSession(),
+ ( CCoeEnv::Static()->AppUi() )->AppHelpContextL () );
+ break;
+ }
+ default:
+ {
+ CEikonEnv::Static()->EikAppUi()->HandleCommandL( aCommand );
+ break;
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::HandleListBoxEventL()
+// Callback for listbox events
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppSettingsDialog::HandleListBoxEventL( CEikListBox* aListBox,
+ TListBoxEvent aEventType )
+ {
+ CHAT_DP( D_CHAT_LIT( "CCAAppSettingsDialog::HandleListBoxEvent %d" ),
+ aEventType );
+
+ if ( aEventType == EEventEditingStarted ||
+ aEventType == EEventEnterKeyPressed ||
+ aEventType == EEventItemDoubleClicked )
+ {
+#ifdef IMPS_CONTACT_FETCH_BACKGROUND
+ CCAAppUi* appUi = static_cast< CCAAppUi* >( iEikonEnv->AppUi() );
+ CIMPSSAPSettings* currentSap = appUi->UISessionManager().CurrentSAPLC();
+ if ( iServer ) // can be NULL
+ {
+ if ( currentSap->SAPName().CompareC( iServer->SAPName(), KCollationLevel, NULL ) == 0 )
+ {
+ CAknSettingItem* item = iSettingItemArray->At( iEditIndex );
+ TSettingListLayout identifier = ( TSettingListLayout )item->Identifier();
+ switch ( identifier )
+ {
+ case EFriendsListUpdate:
+ case EAuthorizePresence:
+ {
+ // if we're logged in, we must wait for
+ // list synchronization to complete
+ if ( appUi->UISessionManager().IsLoggedIn() &&
+ !CCASyncChecker::CheckSyncStateL() )
+ {
+ CleanupStack::PopAndDestroy( currentSap );
+ return;
+ }
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+ }
+ CleanupStack::PopAndDestroy( currentSap );
+#endif //IMPS_CONTACT_FETCH_BACKGROUND
+
+ // Launch dialogs asynchronously, so we can exit this event chain.
+ // If we do this synchronously, a view change (with dialogshutter)
+ // after opening a dialog will crash the application.
+ if ( !iAsyncCallBack->IsActive() )
+ {
+ iIsPopUp = aEventType == EEventEditingStarted ? ETrue : EFalse;
+ iEditIndex = aListBox->CurrentItemIndex();
+ iAsyncCallBack->Call();
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::HandleResourceChange
+// Called when resources change
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppSettingsDialog::HandleResourceChange( TInt aType )
+ {
+ CCoeControl::HandleResourceChange( aType );
+
+ // This is called to update background of slider if skin is
+ // changed while dialog is active
+ TRAP_IGNORE( iSettingItemArray->RecalculateVisibleIndicesL() );
+
+ if ( aType == KEikDynamicLayoutVariantSwitch )
+ {
+ Layout();
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::OfferKeyEventL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TKeyResponse CCAAppSettingsDialog::OfferKeyEventL( const TKeyEvent& aKeyEvent,
+ TEventCode aType )
+ {
+ if ( aKeyEvent.iCode == EKeyEscape )
+ {
+ // Forced exit by dialog shutter
+ TryExitL( EAknSoftkeyExit );
+ return EKeyWasConsumed;
+ }
+
+ return CAknDialog::OfferKeyEventL( aKeyEvent, aType );
+ }
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::DisplayMenuL
+// Display the option menu
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppSettingsDialog::DisplayMenuL()
+ {
+ if ( !GetIsTargetDialogOpened() )
+ CAknDialog::DisplayMenuL();
+ else return;
+ }
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::HandleCBAChangeL()
+// Handles CBA changes
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppSettingsDialog::HandleCBAChangeL( const TInt aResourceId )
+ {
+ CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
+ cba->SetCommandSetL( aResourceId );
+ cba->DrawNow();
+ }
+
+//----------------------------------------------------------
+// CCAAppSettingsDialog::AddToneSettingItemL
+//----------------------------------------------------------
+void CCAAppSettingsDialog::AddToneSettingItemL( TBool aBranded )
+ {
+ iToneFileNamePtr.Set( iToneFileName->Des() );
+ iSAPExtension->GetToneFileNameL( iToneFileNamePtr );
+ CAknSettingItem* toneSett = new ( ELeave ) CCAToneSettingItem( EMessageTone,
+ iToneFileNamePtr, *iCenRep, aBranded );
+ CleanupStack::PushL( toneSett );
+ HBufC* itemTitle =
+ iEikonEnv->AllocReadResourceLC( R_CHAT_AUDIO_SETTING_TEXT );
+ toneSett->ConstructL( EFalse, 0, *itemTitle, NULL, NULL, NULL );
+ iSettingItemArray->AppendL( toneSett );
+ CleanupStack::PopAndDestroy( itemTitle );
+ CleanupStack::Pop( toneSett );
+ }
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::DynInitMenuPaneL
+// Setup the menupane
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppSettingsDialog::DynInitMenuPaneL( TInt aResourceId,
+ CEikMenuPane* aMenuPane )
+ {
+ // if we're displaying general menu and help feature is not supported..
+ if ( aResourceId == R_CHATCLIENT_GENERAL_MENU &&
+ !FeatureManager::FeatureSupported( KFeatureIdHelp ) )
+ {
+ // dimm the help menu item
+ aMenuPane->SetItemDimmed( EChatClientCmdHelp, ETrue );
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::PreLayoutDynInitL
+// Setup the dialog dynamically
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppSettingsDialog::PreLayoutDynInitL()
+ {
+ iCenRep = CRepository::NewL( KCRUidIM );
+
+ CCAAppUi* appUi = static_cast< CCAAppUi* >( iEikonEnv->AppUi() );
+ MCACommandFactory* commandManager = CCACommandManagerFactory::InstanceL()->GetCommandManager();
+ iCommandSetings = static_cast< MCASettingsCommand* > ( commandManager->NewCommandL( EChatClientApplicationSettings, appUi->GetProcessManager(), *this ) );
+
+ iCommandSetings->ExecuteCommandL();
+
+ iSAPExtension = iCommandSetings->GetAppSettingsSAPExt();
+
+ CIMPSSAPSettings* server = NULL;
+
+#ifdef RD_SETTINGS_FACELIFT
+ server = iServer;
+ iTitlePane->SetTitleL( server->SAPName() );
+#else
+ UpdateTitlePaneL( R_CHATCLIENT_APPSETTINGS_TITLE );
+#endif //RD_SETTINGS_FACELIFT
+
+
+ iDefaultNickName = HBufC::NewL( KNicknameMaxLength );
+ iOldDefaultNick = iDefaultNick = iSettingsPC->GetBoolValuePC( TEnumsPC::EDefaultScreenNameInUse, server );
+
+
+ iOldAuthorizeIMPr = iAuthorizeIMPr = iSettingsPC->GetIntValuePC( TEnumsPC::EAuthorizeIMPresence, server );
+
+
+ iOldReceiveIMessages = iReceiveIMessages = iSettingsPC->GetIntValuePC( TEnumsPC::EReceiveIMessages, server );
+
+
+ iOldReceiveInvitations = iReceiveInvitations = iSettingsPC->GetIntValuePC( TEnumsPC::EReceiveInvitations, server );
+
+
+ iOldMsgFlow = iMsgFlow = iSettingsPC->GetIntValuePC( TEnumsPC::EMessageFlowSettingLevel, server );
+
+
+ iOldShowTimeStamp = iShowTimeStamp = iSettingsPC->GetBoolValuePC( TEnumsPC::EShowTimeStamps, server );
+
+
+ iOldAutoUpdFriends = iAutoUpdFriends = iSettingsPC->GetBoolValuePC( TEnumsPC::EAutomaticPresenceUpdate, server );
+
+
+ iOldShowOffline = iShowOffline = iSettingsPC->GetBoolValuePC( TEnumsPC::EShowOffline, server );
+
+
+ iOldOrderAlphabetically = iOrderAlphabetically = iSettingsPC->IsAlphabeticalPC( server );
+
+
+ // If this is the first time when settings are opened, then set message
+ // flow to "normal"
+ if ( iMsgFlow < KMessageFlowMin || iMsgFlow > KMessageFlowMax )
+ {
+ iMsgFlow = iOldMsgFlow = KMessageFlowNormal;
+ }
+
+ // Set default nickname, if it's used
+ if ( iDefaultNick )
+ {
+ TPtr nickNamePtr( iDefaultNickName->Des() );
+ HBufC* screenname = iSettingsPC->GetSapSettingValuePCL( TEnumsPC::EDefaultScreenName,
+ server );
+ nickNamePtr.Copy( ( *screenname ).Left( nickNamePtr.MaxLength() ) );
+ delete screenname;
+ iOldDefaultNickName = nickNamePtr.AllocL();
+ }
+
+ // Initialize variables needed for adding new items
+ iListbox = static_cast< CAknSettingStyleListBox* >( Control(
+ EChatClientControlIdAppSettings ) );
+ //2 is array granularity and 1 is first ordinal
+ iSettingItemArray = new ( ELeave ) CAknSettingItemArray( 2, EFalse, 1 );
+ //2 is array granularity
+ // CodeScanner warning is ignored because array is not used here
+ // and ownership is transferred to list box immediately
+ CArrayPtr< CGulIcon >* icons = new( ELeave ) CArrayPtrFlat< CGulIcon >( 2 ); // CSI: 6 # See comment above
+ // Transfer icons-array ownership to listbox
+ iListbox->ItemDrawer()->ColumnData()->SetIconArray( icons );
+
+ // read variation flag values
+ TInt haveScreenName =
+ IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_SCREENNAME_SETTING );
+ TInt haveGrant =
+ IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_HAVEGRANT );
+ TInt havePresenceAuth =
+ IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_HAVEPRESENCEAUTH );
+ // Check this value IM SingleView
+ TInt updateContactsSetting =
+ IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_UPDATE_CONTACTS_SETTING );
+
+
+
+ // and check dynamic features
+ if ( havePresenceAuth )
+ {
+ havePresenceAuth = appUi->UISessionManager().IsSupported(
+ CCAUISessionManager::EAttrList );
+ }
+
+ TBool groups( appUi->UISessionManager().IsSupported(
+ CCAUISessionManager::EGroup ) );
+ TBool invitations( appUi->UISessionManager().IsSupported(
+ CCAUISessionManager::EInvite ) );
+
+
+ if ( haveScreenName && groups )
+ {
+ // Add item for nickname setting
+ AddBinaryItemL( iDefaultNick,
+ ENickName,
+ R_CHATCLIENT_APPSETTINGS_DEFNICK_TITLE,
+ R_CHAT_SET_DEF_NICK,
+ R_CHAT_SET_DEF_NICK_TEXTS );
+ }
+
+
+ if ( havePresenceAuth )
+ {
+ // Add item for authorize IM presence setting
+ AddEnumTextItemL( iAuthorizeIMPr,
+ EAuthorizePresence,
+ R_CHATCLIENT_APPSETTINGS_AUTHORIZEIMPR_TITLE,
+ R_CHAT_SET_AUTHORIZEIMPR,
+ R_CHAT_SET_AUTHORIZEIMPR_TEXTS );
+ }
+
+ if ( haveGrant )
+ {
+ // Add item for receive instant messages setting
+ AddEnumTextItemL( iReceiveIMessages,
+ EReceiveIMessages,
+ R_CHATCLIENT_APPSETTINGS_RECEIVEIMESSAGES_TITLE,
+ R_CHAT_SET_RECEIVEIMESSAGES,
+ R_CHAT_SET_RECEIVEIMESSAGES_TEXTS );
+ }
+
+ if ( groups && invitations )
+ {
+ // Add item for receive invitations setting
+ AddEnumTextItemL( iReceiveInvitations,
+ EReceiveInvitations,
+ R_CHATCLIENT_APPSETTINGS_RECEIVEINVITATIONS_TITLE,
+ R_CHAT_SET_RECEIVEINVITATIONS,
+ R_CHAT_SET_RECEIVEINVITATIONS_TEXTS );
+ }
+
+
+ // Add item for contact list ordering
+ AddBinaryItemL( iOrderAlphabetically,
+ EContactOrdering,
+ R_CHATCLIENT_APPSETTINGS_ORDERCONTACTS_TITLE,
+ R_CHAT_SET_ORDERCONTACTS,
+ R_CHAT_SET_ORDERCONTACTS_TEXTS );
+
+ // Add item for presence automatic update setting
+ if ( updateContactsSetting == 0 )
+ // 0: automatic and manual modes are supported
+ {
+ AddBinaryItemL( iAutoUpdFriends,
+ EFriendsListUpdate,
+ R_CHATCLIENT_APPSETTINGS_FRIENDUPD_TITLE,
+ R_CHAT_SET_FRIENDUPD,
+ R_CHAT_SET_FRIENDUPD_TEXTS );
+ }
+
+ // Add item for "show offline" setting
+ AddBinaryItemL( iShowOffline,
+ EShowOffline,
+ R_QTN_CHAT_SET_SHOW_OFFLINE_CONTACTS,
+ R_CHAT_SET_SHOW_OFFLINE,
+ R_CHAT_SET_SHOW_OFFLINE_TEXTS );
+
+ //Tone settings
+#ifdef RD_30_COMPATIBILITY_MODE
+
+ iBrandedTones =
+ IMUtils::IntResourceValueL( R_AUDIO_FILELIST_MODEL_ENABLED );
+
+#else // S60 Common
+
+ // Check CR variation
+ if ( IMUtils::CRKeyL( KCRUidIMVariation, KIMVariationKey )
+ & EIMFeatBrandableTones )
+ {
+ // The brandtones setting is fetched only from Resource file, so IntResourceValueFromRssL is used instead of IntResourceValueL (which avoids searching the id in Cenrep)
+ iBrandedTones =
+ IMUtils::IntResourceValueFromRssL( RSC_CHAT_BRANDED_TONES );
+ }
+
+#endif // RD_30_COMPATIBILITY_MODE
+ iToneFileName = HBufC::NewL( KMaxPath );
+ //Add tone setting item, if curren SAP is valid
+ CIMPSSAPSettings* currSAP = NULL;
+ TRAPD( err,
+ {
+ currSAP = iUISessionManager->CurrentSAPLC();
+ CleanupStack::PopAndDestroy( currSAP );
+ }
+ );
+
+ if ( !err )
+ {
+ // the color settings
+ iOwnColorDefined = iSAPExtension->IntValueL( KIMOwnMessageColourKey )
+ != KErrNotFound;
+ iOthersColorDefined =
+ iSAPExtension->IntValueL( KIMOthersMessageColourKey )
+ != KErrNotFound;
+
+ AddColourItemL(
+ KIMOwnMessageColourKey,
+ iOwnColorDefined,
+ EOwnColor,
+ R_QTN_CHAT_SET_FONT_COLOURS_OWN/*,
+ R_CHAT_SET_MESSAGE_COLOR*/ );
+
+ AddColourItemL(
+ KIMOthersMessageColourKey,
+ iOthersColorDefined,
+ EOtherColor,
+ R_QTN_CHAT_SET_FONT_COLOURS_OTHER/*,
+ R_CHAT_SET_MESSAGE_COLOR*/ );
+ }
+
+ // Add item for "timestamp" setting
+ AddBinaryItemL( iShowTimeStamp,
+ EShowTimeStamp,
+ R_QTN_CHAT_SETTINGS_TIMESTAMP,
+ R_CHAT_SET_TIMESTAMP,
+ R_CHAT_SET_TIMESTAMP_TEXTS );
+
+ if ( !err )
+ {
+ // we have valid SAP
+ AddToneSettingItemL( iBrandedTones );
+ iToneFileInUse = ETrue;
+ }
+
+ CTextListBoxModel* model = iListbox->Model();
+ model->SetItemTextArray( iSettingItemArray );
+ // Ownership retained by us
+ model->SetOwnershipType( ELbmDoesNotOwnItemArray );
+
+ iSettingItemArray->RecalculateVisibleIndicesL();
+ iListbox->SetMopParent( this );
+ iListbox->CreateScrollBarFrameL( ETrue );
+ iListbox->ScrollBarFrame()->SetScrollBarVisibilityL(
+ CEikScrollBarFrame::EOff,
+ CEikScrollBarFrame::EAuto );
+ iListbox->HandleItemAdditionL();
+ iListbox->SetListBoxObserver( this );
+ iListbox->UpdateScrollBarsL();
+
+ // create callback object
+ iAsyncCallBack = new( ELeave )CAsyncCallBack(
+ TCallBack( CallBack, this ), CActive::EPriorityIdle );
+ }
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::OkToExitL
+// Can exit the dialog or not
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CCAAppSettingsDialog::OkToExitL( TInt aButtonId )
+ {
+
+
+ // if edit item is ongoing,avoid to shut dialog and destruct.
+ if ( iIsEditItemFlag )
+ {
+ return EFalse;
+ }
+
+ if ( aButtonId == EAknSoftkeyOptions )
+ {
+ DisplayMenuL();
+ return EFalse;
+ }
+
+ if ( aButtonId == EAknSoftkeyBack || aButtonId == EAknSoftkeyExit )
+ {
+ CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
+ cba->MakeCommandVisible( EAknSoftkeyBack, EFalse );
+ iSavingFlag = ETrue;
+ }
+
+ if ( aButtonId == EAknSoftkeyEdit )
+ {
+ // MSK command
+ HandleListBoxEventL( iListbox, EEventEnterKeyPressed );
+ return EFalse;
+ }
+
+ CCAAppUi* appUi = static_cast< CCAAppUi* >( iEikonEnv->AppUi() );
+ appUi->ShowWaitDialogL( R_QTN_CHAT_WAIT_SAVINGSETTINGS );
+
+
+ TRAPD( leave, StoreValuesL() );
+ // the dismisswaitdialogL leaves with the error code
+ // and we must trap it to be able to exit the settings
+ TRAPD( leave2, appUi->DismissWaitDialogL( leave ) );
+
+ // show any system errors
+ if ( leave2 )
+ {
+ CActiveScheduler::Current()->Error( leave2 );
+ }
+
+ UpdateTitlePaneL( R_CHATCLIEN_SETTINGS_VIEW_TITLE );
+
+ if ( ( leave2 == KErrDiskFull || leave2 == KErrNoMemory ) &&
+ ( aButtonId != EAknSoftkeyExit && aButtonId != EEikCmdExit
+ && aButtonId != EChatClientCmdExit )
+ )
+ {
+ // no memory/disk due to failing network operations,
+ // can't do rollback so we must stay here
+ // BUT if the user really wants exit via Options/Exit then we must
+ // go, no matter what.
+ iSavingFlag = EFalse;
+ return EFalse;
+ }
+
+ return ETrue;
+ }
+
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::DisplayTextSettingPageL
+// Launches text-setting page
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppSettingsDialog::DisplayTextSettingPageL()
+ {
+ TPtr defaultNickName( iDefaultNickName->Des() );
+ CAknSettingPage* dlg = new( ELeave ) CAknTextSettingPage(
+ R_CHAT_SET_DEF_NICK_EDIT, defaultNickName,
+ CAknTextSettingPage::EZeroLengthNotOffered
+ | CAknTextSettingPage::EPredictiveTextEntryPermitted );
+
+ dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged );
+ }
+
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::AddBinaryItemL
+// Add binary-type item to the settings array
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppSettingsDialog::AddBinaryItemL( TBool& aBuffer, TInt aId,
+ TInt aTitleResource, TInt aSettingPageResource,
+ TInt aAssociatedResource )
+ {
+ // Create new setting item
+ CAknSettingItem* settingItem =
+ new ( ELeave ) CAknBinaryPopupSettingItem( aId, aBuffer );
+ CleanupStack::PushL( settingItem );
+
+ // Construct setting item with parametrized values
+ HBufC* itemTitle = iEikonEnv->AllocReadResourceLC( aTitleResource );
+ settingItem->ConstructL( EFalse, iOrdinal, *itemTitle, NULL,
+ aSettingPageResource, EAknCtPopupSettingList, NULL,
+ aAssociatedResource );
+ CleanupStack::PopAndDestroy( itemTitle );
+ // Append item to settingitem-array
+ iSettingItemArray->AppendL( settingItem );
+ CleanupStack::Pop( settingItem );
+
+ // New item added -> increase item's ordinal value
+ iOrdinal++;
+ }
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::AddEnumTextItemL
+// Add enumerated text-type item to the settings array
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppSettingsDialog::AddEnumTextItemL(
+ TInt& aBuffer,
+ TInt aId,
+ TInt aTitleResource,
+ TInt aSettingPageResource,
+ TInt aAssociatedResource )
+ {
+ // Create new setting item
+ CAknSettingItem* settingItem =
+ new( ELeave )CAknEnumeratedTextPopupSettingItem( aId, aBuffer );
+ CleanupStack::PushL( settingItem );
+
+ // Construct setting item with parametrized values
+ HBufC* itemTitle = iEikonEnv->AllocReadResourceLC( aTitleResource );
+ settingItem->ConstructL( EFalse, iOrdinal, *itemTitle, NULL,
+ aSettingPageResource, EAknCtPopupSettingList,
+ NULL, aAssociatedResource );
+ CleanupStack::PopAndDestroy( itemTitle );
+ // Append item to settingitem-array
+ iSettingItemArray->AppendL( settingItem );
+
+ CleanupStack::Pop( settingItem );
+
+ // New item added -> increase item's ordinal value
+ iOrdinal++;
+ }
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::AddColourItemL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppSettingsDialog::AddColourItemL(
+ const TDesC& aKey,
+ TBool& aBuffer,
+ TInt aId,
+ TInt aTitleResource )
+ {
+ // Create new colour setting item
+ CCAColourSettingItem* settingItem =
+ new ( ELeave ) CCAColourSettingItem( *iSAPExtension, aBuffer, aId );
+ CleanupStack::PushL( settingItem );
+
+ // Construct setting item with parametrized values
+ HBufC* itemTitle = iEikonEnv->AllocReadResourceLC( aTitleResource );
+ CArrayPtr<CGulIcon>* iconArray =
+ iListbox->ItemDrawer()->ColumnData()->IconArray();
+
+ settingItem->ConstructL(
+ aKey,
+ iOrdinal,
+ *itemTitle,
+ iconArray );
+
+ CleanupStack::PopAndDestroy( itemTitle );
+ // Append item to settingitem-array
+ iSettingItemArray->AppendL( settingItem );
+
+ CleanupStack::Pop( settingItem );
+
+ // New item added -> increase item's ordinal value
+ iOrdinal++;
+ }
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::StoreValuesL
+// Store the setting values to persistent storage
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppSettingsDialog::StoreValuesL()
+ {
+ StoreAllL();
+ // Attention ///////////////////////////////////////////
+ // Store first all settings that don't cause any network operations
+ //
+ CIMPSSAPSettings* server = NULL;
+
+#ifdef RD_SETTINGS_FACELIFT
+ server = iServer;
+#endif //RD_SETTINGS_FACELIFT
+ // nickname
+ if ( iDefaultNick && iDefaultNickName->Length() > 0 )
+ {
+ iSettingsPC->SetBoolValuePCL( TEnumsPC::EDefaultScreenNameInUse, ETrue, NULL, server );
+ iSettingsPC->SetSapSettingValuePCL( TEnumsPC::EDefaultScreenName, *iDefaultNickName, NULL, server );
+ }
+ else
+ {
+ iSettingsPC->SetBoolValuePCL( TEnumsPC::EDefaultScreenNameInUse, EFalse, NULL, server );
+
+ if ( iOldDefaultNick )
+ {
+ CCAAppUi* appUi = static_cast< CCAAppUi* >( iEikonEnv->AppUi() );
+ TPtr ptr( appUi->ScreenNamePtr()->Des() );
+ ptr.Copy( KNullDesC() );
+ }
+ }
+
+ // flow control
+ iSettingsPC->SetIntValuePCL( TEnumsPC::EMessageFlowSettingLevel, iMsgFlow, NULL, server );
+
+ // contact list ordering
+ TInt order( TEnumsPC::EPresence );
+ if ( iOrderAlphabetically )
+ {
+ order = TEnumsPC::EAlphabetical;
+ }
+ iSettingsPC->SetIntValuePCL( TEnumsPC::EFriendsListOrdering, order, NULL, server );
+
+ // "show offline contacts"
+ iSettingsPC->SetBoolValuePCL( TEnumsPC::EShowOffline, iShowOffline, NULL, server );
+
+ // receive invitations - this is currently handled locally,
+ // so no network operations needed for changing this
+ iSettingsPC->SetIntValuePCL( TEnumsPC::EReceiveInvitations,
+ iReceiveInvitations, NULL, server );
+
+ // Show "timestamp" setting
+ iSettingsPC->SetBoolValuePCL( TEnumsPC::EShowTimeStamps,
+ iShowTimeStamp, NULL, server );
+
+ // Attention//////////
+ // The following setting items might require a network operation
+ //
+
+ RArray<TInt> ignoreRollback;
+ CleanupClosePushL( ignoreRollback );
+ // ignore rollback operation of settings manager
+ // in following error situations
+ User::LeaveIfError( ignoreRollback.Append( ECSPPartiallySuccessful ) );
+ User::LeaveIfError( ignoreRollback.Append( ECSPUnknownUserId ) );
+
+ // receive IMessages from
+ TRAPD( errReceiveIMsg, iSettingsPC->SetIntValuePCL( TEnumsPC::EReceiveIMessages,
+ iReceiveIMessages, &ignoreRollback, server ); );
+ HandleErrorL( errReceiveIMsg );
+
+ // authorize IM presence to
+ TRAPD( errAuthorize, iSettingsPC->SetIntValuePCL(
+ TEnumsPC::EAuthorizeIMPresence, iAuthorizeIMPr, &ignoreRollback, server ); );
+ HandleErrorL( errAuthorize );
+
+ // automatic presence update
+ TRAPD( errAutoUpd, iSettingsPC->SetBoolValuePCL(
+ TEnumsPC::EAutomaticPresenceUpdate,
+ iAutoUpdFriends, &ignoreRollback, server ); );
+
+ HandleErrorL( errAutoUpd );
+
+ if ( iToneFileInUse )
+ {
+ iSAPExtension->SetToneFileNameL( *iToneFileName ); //;SetToneFileNameL( *iToneFileName );
+ }
+
+ // Flush data to persistent storage
+ iSettingsPC->FlushDataPC();
+
+ if ( errReceiveIMsg || errAuthorize || errAutoUpd )
+ {
+ CHAT_DP_TXT( "**Settings not updated properly**" );
+ // something went wrong, leave with general server error code
+ // unless it's partially succesful
+ if ( errReceiveIMsg != ECSPPartiallySuccessful &&
+ errAuthorize != ECSPPartiallySuccessful &&
+ errAutoUpd != ECSPPartiallySuccessful )
+ {
+ CHAT_DP_TXT( "**leaving**" );
+ User::Leave( EGeneralServerError );
+ }
+ }
+
+ CleanupStack::PopAndDestroy(); // ignoreRollback.Close()
+ }
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::HandleErrorL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppSettingsDialog::HandleErrorL( TInt aErrorCode )
+ {
+ CHAT_DP( D_CHAT_LIT( "CCAAppSettingsDialog::HandleErrorL %d" ), aErrorCode );
+ if ( ( aErrorCode < KErrNone ) && ( aErrorCode > Imps_ERROR_BASE ) )
+ {
+ // leave on everything but IMPS errors
+ User::Leave( aErrorCode );
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::StoreAllL
+// Externalizes the values of setting items' iternal buffers
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppSettingsDialog::StoreAllL() const
+ {
+ TInt settingCount( iSettingItemArray->Count() );
+ for ( TInt ii( 0 ); ii < settingCount ; ++ii )
+ {
+ ( *iSettingItemArray )[ii]->StoreL();
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::UpdateTitlePaneL
+// Updates title-pane text with text found from given resource id
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppSettingsDialog::UpdateTitlePaneL( const TInt aResourceId )
+ {
+ iTitlePane->SetTitleL( iEikonEnv, aResourceId );
+ }
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::LaunchDialog
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CCAAppSettingsDialog::CallBack( TAny* aInstance )
+ {
+ TInt retVal( EFalse );
+ TRAPD( error, static_cast<CCAAppSettingsDialog*>( aInstance )->DoHandleCallBackL(); );
+ if ( error )
+ {
+ CActiveScheduler::Current()->Error( error );
+ }
+
+ static_cast<CCAAppSettingsDialog*>( aInstance )->SetIsTargetDialogOpened( EFalse );
+
+ return retVal;
+ }
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::DoHandleCallBackL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CCAAppSettingsDialog::DoHandleCallBackL()
+ {
+ // If one item is in editing, just return
+ if ( iIsEditItemFlag )
+ return EFalse;
+
+ __ASSERT_ALWAYS( iEditIndex >= 0 &&
+ iEditIndex < iSettingItemArray->MdcaCount(),
+ User::Leave( KErrArgument ) );
+
+ // Check disk space before editing
+ IMUtils::FFSSpaceBelowCriticalLevelL();
+
+ TBool reload( EFalse );
+
+ CAknSettingItem* item = iSettingItemArray->At( iEditIndex );
+ TSettingListLayout identifier = ( TSettingListLayout )item->Identifier();
+
+ // edit it
+ // lock edit item operationto to avoid OkToExit() invoke
+ // before EditItem() function finished.
+ iIsEditItemFlag = ETrue;
+ TRAPD( err, item->EditItemL( iIsPopUp ) );
+ iIsEditItemFlag = EFalse;
+ if ( err == KErrCancel )
+ {
+ // if canceled return immediately.
+ return EFalse;
+ }
+ item->StoreL();
+
+ iListbox->DrawItem( iEditIndex );
+
+ // Do special settings handling for certain items
+ switch ( identifier )
+ {
+ case ENickName:
+ {
+ if ( iDefaultNick )
+ {
+ DisplayTextSettingPageL();
+ // If user did not give default nickname, then turn default
+ // nickname option off
+ if ( iDefaultNickName->Length() == 0 )
+ {
+ iDefaultNick = EFalse;
+ reload = ETrue;
+ }
+ }
+ break;
+ }
+ case EFriendsListUpdate:
+ {
+ if ( !iAutoUpdFriends )
+ {
+ IMDialogUtils::DisplayInformationNoteL( R_QTN_CHAT_SET_WATCH_DEACTIVATED );
+ }
+ break;
+ }
+
+ default:
+ {
+ // avkon handles other items
+ break;
+ }
+ }
+
+ if ( reload )
+ {
+ // reload and update item
+ item->LoadL();
+ item->UpdateListBoxTextL();
+ iListbox->DrawItem( iEditIndex );
+ }
+
+ HandleCBAChangeL( R_CHAT_SOFTKEYS_OPTIONS_BACK__CHANGE );
+ return EFalse;
+ }
+
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+
+void CCAAppSettingsDialog::GetParameters( MCAUiSettingsDialogCmdCB::TSettingsDialogParams& aSettingsDialogParams )
+ {
+
+ aSettingsDialogParams.iPreserveSessionIdInExit = EFalse;
+
+ aSettingsDialogParams.iSap = iServer;
+ }
+
+
+
+/**
+ * Help Key Support
+ * This function is called by the Framework to get the context to launch
+ * Help
+ *
+ * @param aContext The context that contains the appid and the help id.
+ */
+void CCAAppSettingsDialog::GetHelpContext(
+ TCoeHelpContext& aContext ) const
+ {
+ aContext.iMajor = KUidChatClient;
+ aContext.iContext = KIMNG_HLP_APPSETT;
+ }
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::SetIsTargetDialogOpened
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppSettingsDialog::SetIsTargetDialogOpened( TBool aBool )
+ {
+ iIsTargetDialogOpened = aBool;
+ }
+
+// ---------------------------------------------------------
+// CCAAppSettingsDialog::GetIsTargetDialogOpened
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CCAAppSettingsDialog::GetIsTargetDialogOpened()
+ {
+ return iIsTargetDialogOpened;
+ }
+
+// End of File