--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/wvuiave/AppSrc/CCAAppUi.cpp Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,3938 @@
+/*
+* 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: AppUi class of application
+ * Since : 3.2
+ *
+*/
+
+
+#include <WVSettingsSharedDataNG.h>
+#include <cimpsconnectionuingagent.h>
+#include <PEngWVPresenceAttributes2.h>
+#include <cdlengine.h>
+ #include "MCAGroupManagerInterface.h"
+
+/* A single usage of imps error base constant.
+ * Hence not moved to the process component.
+ */
+#include "ImpsCSPAllErrors.h"
+
+#include "CCAEngine.h" // Model
+#include "CIMPSSAPSettings.h"
+#include "CIMPSSAPSettingsStore.h"
+
+#include "CCAAppUi.h"
+#include "CCAApp.h"
+#include "CAExternalInterface.h" // UIDs
+#include "ChatDefinitions.h" // Constant definitions
+#include "chatngclient.hrh" // resource header file
+#include "ChatDebugPrint.h" // For debug macros
+#include "IMNoteMapper.h"
+#include "IMDialogUtils.h"
+#include "IMUtils.h"
+#include "CAViewCreator.h" //View creator
+#include "CAUtils.h"
+#include "CAVersion.h" //Version info provider
+#include "CCAStatusPaneHandler.h" // For statuspane application wide handling
+#include "CCAAudioManager.h"
+#include "CCAVariantFactory.h" // for variation
+#include "CCAInputAbsorber.h"
+#include "CCAGroupUtils.h"
+#include "CCAUISessionManager.h"
+#include "CCAIconLoader.h"
+#include "CCAMessageExtensionsHandler.h"
+#include "CAArrayUtils.h"
+#include "CCAWaitNote.h"
+#include "MCASkinVariant.h"
+#include "MCAOpBrandVariant.h"
+#include "MCAAHVariant.h"
+#include "MCALayoutChangeObserver.h"
+#include "CANotifierFactory.h"
+#include "MCANotifierInterface.h"
+#include "CCAGlobalNoteHandler.h"
+#include "TCAChatListBoxLayout.h"
+#include "CCALayoutInfo.h"
+#include "mcaresourcechangeobserver.h"
+#include "CCAAppSettingsDialog.h"
+#include "CCAAppSettingsSAPExt.h"
+#include "chatdebugassert.h"
+#include "iminternalpskeys.h"
+#include "imnginternalcrkeys.h"
+#include "imprivatecrkeys.h"
+#include "imvariant.hrh"
+#include "mcaserverchangenotify.h"
+#include "CWVSettingsUINGDialog.h"
+
+#include "CCASplashScreen.h"
+//process component
+#include "CCACommandManagerFactory.h"
+#include "CCACommandManager.h"
+#include "MCALoginPC.h"
+#include "MCAProcessManager.h"
+#include "MCACommand.h"
+#include "MCAMainViewArrayPC.h"
+#include "MCAConversationPC.h"
+#include "MCAGroupPC.h"
+#include "MCASettingsPC.h"
+#include "MCARecordedChatsArrayPC.h"
+#include "CCAPCUtils.h"
+#include "MCAApplicationNGPC.h"
+#include "IMMessageUtilsPC.h"
+#include "MCAGlobalNotificationObserverPC.h"
+#include "MCAConversationMessage.h"
+#include "MCAInvitationPC.h"
+#include "MCASettingsPC.h"
+#include "MCABackgroundTaskObserver.h"
+
+
+#include <data_caging_path_literals.hrh>
+#include <hlplch.h>
+#include <aknenv.h>
+#include <ChatNG.rsg>
+#include <ChatNG.mbg>
+#include <CAVariationNG.rsg>
+#include <AknDlgShut.h>
+#include <AknSoftNotifier.h>
+#include <AknsUtils.h>
+#include <bautils.h>
+#include <FeatMgr.h> // feature manager
+#include <sysutil.h>
+#include <aknsconstants.h>
+
+#include <aknlistquerydialog.h>
+#include <StringLoader.h>
+
+#include <s32file.h> // File streams
+#include <s32mem.h> //CBufStore
+#include <s32stor.h> // CStreamStore
+#include <s32buf.h> // TStreamPos
+#include <aknnotewrappers.h>
+#include <akniconarray.h>
+#include <bldvariant.hrh>
+#include <akndef.h>
+
+#include <aknsconstants.h>
+#include <aknsconstants.hrh>
+#include <AknUtils.h>
+#include <eikdef.h>
+#include <COEAUI.H>
+#include <SkinLayout.cdl.h>
+#include <LayoutMetaData.cdl.h>
+#include <AknLayoutScalable_Avkon.cdl.h>
+#include <aknstatuspaneutils.h>
+#include <aknlayoutscalable_avkon.cdl.common.h>
+#include <errorui.h>
+#include <e32std.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 "MCABlocking.h"
+
+#ifdef RD_MULTIPLE_DRIVE
+#include <driveinfo.h>
+#include <rsfwmountman.h>
+#endif
+_LIT( KPrivateVersionFile, "IMVersion.txt" );
+_LIT( KPublishedVersionFile, "\\System\\data\\IMVersion\\IMVersion.txt" );
+_LIT( KFileName, "z:\\resource\\apps\\chatng.mif" );
+
+const TUid KSDUidSysApLocal = {0x100058F3};
+
+// For own status
+const TInt KAmountOfOwnStatusStates = 3;
+const TInt KOnlineIconIndex = 0;
+
+const TInt KMaxStatusMessageCount = 4;
+
+// This is used in IMPSCommonUi in CCnUiClientPluginIM.cpp
+// If this is changed, remember to change also in IMPSCommonUi side.
+const TInt KStatusMessageHeaderLength = 3; // length of status message header.
+// KStatusMessageHeaderLength must be used as amount of characters for format.
+_LIT( KStatusMessageHeaderFormat, "%3d" );
+_LIT( KStatusMessageHeaderLengthFormat, "%d" ); // This is length of header.
+_LIT( KWVSettingsResFileName, "CWVSETTINGSUING.RSC" );
+_LIT( KIMPSConnUIResFileName, "IMPSCONNECTIONUING.RSC" );
+// The IM UI Settings are in the Resource file now.
+_LIT( KIMPSCUVariationResFileName, "IMConnectionUIVariationNG.RSC" );
+
+// ================= MEMBER FUNCTIONS =======================
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CCAAppUi::CCAAppUi( CCAEngine& aEngine, MCAProcessManager& aProcessManager )
+ : iEngine( aEngine ),
+ iApplicationNGPC( *aProcessManager.GetApplicationNGPC() ),
+ iIsAppForeground( ETrue ),
+ iLayoutObservers( 1 ) /* usually just one observer */,
+ iPlayOnce( EFalse ),
+ iPendingDialogCounter( 0 ),
+ iProcessManager( aProcessManager )
+
+ {
+ CHAT_DP_FUNC_ENTER( "CCAAppUi" );
+ CHAT_DP_FUNC_DONE( "CCAAppUi" );
+ }
+
+// Destructor
+CCAAppUi::~CCAAppUi()
+ {
+
+ if ( iInfoPopup )
+ {
+ iInfoPopup->HideInfoPopupNote();
+ delete iInfoPopup;
+ }
+
+ delete iPreviewMessageList;
+
+ iDestructingFlag = ETrue;
+
+ // Remove observers if they are already set
+ if ( iEngineInitialized )
+ {
+
+ MCAGlobalNotificationObserverPC& globalNotificationObserverPC ( *iProcessManager.GetGlobalNotificationInterface() );
+
+ globalNotificationObserverPC.RemoveGlobalObserver( this );
+
+ }
+
+ FeatureManager::UnInitializeLib();
+ //delete splash screen
+ delete iSplashScreen;
+ iSplashScreen = NULL;
+
+ delete iConnUIAgent;
+ delete iIconLoader;
+ delete iWaitDialog;
+ delete iGroupUtils;
+ delete iConnUI;
+ delete iUISessionManager;
+ delete iScreenName;
+ delete iStatusPaneHandler;
+ delete iAudioManager;
+ // delete iInputAbsorber;
+ delete iExitIdle;
+ delete iForwardMessage;
+ delete iMessageHandler;
+
+ delete iNotifierAPI;
+
+ iLayoutObservers.Close();
+ iResourceObservers.Close();
+
+ delete iCustomMessage;
+ delete iLayoutInfo;
+
+ delete iStatusMessage;
+
+ iSwitchView.Close();
+ iSwitchMessage.Close();
+ iSwitchMessageContent.ResetAndDestroy();
+ iSwitchMessageContent.Close();
+
+
+ delete iSAPSettingsStore;
+ delete iInputAbsorber;
+
+ CCACommandManagerFactory::ReleaseResources();
+ // The Central repository instance needs to be deleted, as it would have been instantiated by InitializeLibL () at the beginning of AppUi
+ //have been instantiated by InitializeLibL () at the beginning of AppUi
+ IMUtils::UnInitializeLib();
+
+ CHAT_DP_TXT( "CCAAppUi::~CCAAppUi done" );
+ }
+
+
+// ---------------------------------------------------------
+// CCAAppUi::ConnectionUI
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CIMPSPresenceConnectionUi& CCAAppUi::ConnectionUI()
+ {
+ return *iConnUI;
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::UISessionManager
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CCAUISessionManager& CCAAppUi::UISessionManager()
+ {
+ return *iUISessionManager;
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::CAStatusPane() const
+// Fetches a handle to status pane handler
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CCAStatusPaneHandler* CCAAppUi::CAStatusPane() const
+ {
+ return iStatusPaneHandler;
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::CAModel() const
+// Fetches a handle to application's engine
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+//CCAEngine& CCAAppUi::CAModel() const
+// {
+// return iEngine;
+// }
+
+// ---------------------------------------------------------
+// CCAAppUi::GetProcessManager() const
+// Returns a reference to application's process manager
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+MCAProcessManager& CCAAppUi::GetProcessManager() const
+ {
+ return iProcessManager;
+ }
+
+
+// ---------------------------------------------------------
+// CCAAppUi::ScreenNamePtr
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+HBufC* CCAAppUi::ScreenNamePtr()
+ {
+ MCASettingsPC* appSettingsPC = GetProcessManager().GetSettingsInterface();
+ TPtr screenNamePtr( iScreenName->Des() );
+
+ // check if there is default screen name specified in settings
+ // and override the existing screen name with the settings value
+ if ( appSettingsPC->GetBoolValuePC( TEnumsPC::EDefaultScreenNameInUse, NULL ) )
+ {
+ HBufC* defaultScreenName = NULL;
+ TRAPD( err, defaultScreenName =
+ appSettingsPC->GetSapSettingValuePCL( TEnumsPC::EDefaultScreenName, NULL ) );
+ if ( err )
+ {
+ CActiveScheduler::Current()->Error( err );
+ }
+
+ if ( !defaultScreenName )
+ {
+ return iScreenName;
+ }
+
+ TPtr defaultScreenNamePtr( defaultScreenName->Des() );
+ screenNamePtr.Copy( defaultScreenNamePtr.Left( screenNamePtr.MaxLength() ) );
+ delete defaultScreenName;
+ }
+
+ // otherwise just return the last used screen name
+ return iScreenName;
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::IMUIPIConForcedClear
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::IMUIPIConForcedClear()
+ {
+ TInt error( iNotifierAPI->SetInt( MCANotifierInterface::EUIPIndKey, EFalse ) );
+ if ( error )
+ {
+ CActiveScheduler::Current()->Error( error );
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::SetSoftNotificationCounter
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::SetSoftNotificationCounterL( TInt aCount ) const
+ {
+ CAknSoftNotifier* softNotifier = CAknSoftNotifier::NewLC();
+ softNotifier->SetNotificationCountL( EChatMessageNotification, aCount );
+ CleanupStack::PopAndDestroy( softNotifier );
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::PlayBeep
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::PlayBeep()
+ {
+ if ( !iPlayOnce )
+ {
+ TRAP_IGNORE( iAudioManager->PlayL() );
+ }
+ else
+ {
+ // Set beep to be played next time when PlayBeep
+ // is called
+ iPlayOnce = EFalse;
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::MbmFullPath
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TDes& CCAAppUi::MbmFullPath()
+ {
+ return iChatMbmFullPath;
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::CaptureEventsL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::CaptureEventsL()
+ {
+ if ( !AreEventsCaptured() )
+ {
+ iInputAbsorber->CaptureEventsL();
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::ReleaseCapturingL()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::ReleaseCapturingL()
+ {
+ if ( AreEventsCaptured() )
+ {
+ iInputAbsorber->Release();
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::AreEventsCaptured
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CCAAppUi::AreEventsCaptured() const
+ {
+ return iInputAbsorber->IsCaptured();
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::AddLayoutChangeObserver
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::AddLayoutChangeObserver( MCALayoutChangeObserver* aObserver )
+ {
+ TInt err( iLayoutObservers.Append( aObserver ) );
+ if ( err )
+ {
+ CActiveScheduler::Current()->Error( err );
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::RemoveLayoutChangeObserver
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::RemoveLayoutChangeObserver( MCALayoutChangeObserver* aObserver )
+ {
+ // remove from end first (LIFO) to avoid
+ // tweaking the index while removing
+ TInt count( iLayoutObservers.Count() );
+ for ( TInt i( count - 1 ); i >= 0; i-- )
+ {
+ if ( iLayoutObservers[i] == aObserver )
+ {
+ iLayoutObservers.Remove( i );
+ }
+ }
+ iLayoutObservers.Compress();
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::AddResourceChangeObserver
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::AddResourceChangeObserver( MCAResourceChangeObserver* aObserver )
+ {
+ TInt err( iResourceObservers.Append( aObserver ) );
+ if ( err )
+ {
+ CActiveScheduler::Current()->Error( err );
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::RemoveResourceChangeObserver
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::RemoveResourceChangeObserver( MCAResourceChangeObserver* aObserver )
+ {
+ // remove from end first (LIFO) to avoid
+ // tweaking the index while removing
+ TInt count( iResourceObservers.Count() );
+ for ( TInt i( count - 1 ); i >= 0; i-- )
+ {
+ if ( iResourceObservers[i] == aObserver )
+ {
+ iResourceObservers.Remove( i );
+ }
+ }
+ iResourceObservers.Compress();
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::NotifyResourceChange
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::NotifyResourceChangeL()
+ {
+ TInt count( iResourceObservers.Count() );
+ TInt err = KErrNone;
+ for ( TInt i( 0 ); i < count; ++i )
+ {
+ // Notify every observer (even in case of leave)
+ TRAPD( error, iResourceObservers[i]->ResourceChangedL() );
+
+ // store last error
+ if ( error != KErrNone )
+ {
+ err = error;
+ }
+ }
+
+ // Show that something went wrong (only last error)
+ if ( err )
+ {
+ CActiveScheduler::Current()->Error( err );
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::HandleInvitation
+// handle an incoming invitation
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::HandleInvitationEventL( TEnumsPC::TInviteType aInviteType,
+ const TDesC& aUserID,
+ const TDesC& aMessage )
+ {
+ CHAT_DP_TXT( "CCAAppUi::HandleInvitation, Invitation received." );
+
+ if ( aInviteType == TEnumsPC::ENewInvite )
+ {
+ AddToPreviewListL( aUserID, aMessage );
+
+ if ( !iInfoNoteShowing )
+ {
+ ShowInfoPopupL();
+ }
+ PlayBeep();
+ }
+ else if ( aInviteType != TEnumsPC::EInviteRead )
+ {
+ return;
+ }
+ UpdateIMUIPIcon();
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::HandleInvitationResponse
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::HandleInvitationResponse( TBool aAcceptance,
+ const TDesC& aUserId,
+ const TDesC& aGroupName,
+ const TDesC& aResponse )
+ {
+ CHAT_DP_TXT( "CCAAppUi::HandleInvitationResponse" );
+ PlayBeep();
+
+ TRAPD( err, DoHandleInvitationResponseL(
+ aAcceptance, aUserId, aGroupName, aResponse ) );
+ if ( err )
+ {
+ CActiveScheduler::Current()->Error( err );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::HandleWsEventL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::HandleWsEventL( const TWsEvent& aEvent, CCoeControl* aDestination )
+ {
+ if (aEvent.Key()->iCode == EKeyEscape && iGroupUtils)
+ {
+ if (iGroupUtils->GetJoinGroupID() .Compare(KEmptyDesC) != KErrNone)
+ {
+ iGroupManagerInterface = iEngine.GetGroupInterface();
+ iGroupManagerInterface->CancelGroupOperationL(iGroupUtils->GetJoinGroupID());
+ }
+ }
+
+ if (aEvent.Key()->iCode == EKeyEscape)
+ {
+ iIsFSWExit = ETrue;
+ }
+
+ switch ( aEvent.Type() )
+ {
+ case KAknUidValueEndKeyCloseEvent:
+ {
+ // Chat goes to background only, does not close the app because
+ // we'd have to show a query; not possible when pressing end key
+ // a long time
+ TVwsViewId idleViewid;
+ TInt res = AknDef::GetPhoneIdleViewId( idleViewid );
+ if ( res != KErrNone ) //go to application shell if no idle available
+ {
+ /*ActivateViewL( KAknApplicationShellViewId );*/
+ TApaTaskList taskList(CCoeEnv::Static()->WsSession());
+ TApaTask chatng = taskList.FindApp( KUidChatClient );
+
+ // Send the IM to background
+ chatng.SendToBackground();
+ }
+ else
+ {
+ ActivateViewL( idleViewid );
+ }
+ break;
+ }
+ default:
+ {
+ CAknViewAppUi::HandleWsEventL( aEvent, aDestination );
+ break;
+ }
+ }
+ }
+
+
+// ---------------------------------------------------------
+// CCAAppUi::HandleCommandL(TInt aCommand)
+// From CEikAppUi, takes care of command handling.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::HandleCommandL( TInt aCommand )
+ {
+ CHAT_DP( D_CHAT_LIT( "AppUI received command: %d" ), aCommand );
+ CHAT_DP( D_CHAT_LIT( "--EEikCmdExit is %d" ), ( TInt )EEikCmdExit );
+ CHAT_DP( D_CHAT_LIT( "--EAknCmdExit is %d" ), ( TInt )EAknCmdExit );
+ CHAT_DP( D_CHAT_LIT( "--EAknSoftkeyExit is %d" ), ( TInt )EAknSoftkeyExit );
+ CHAT_DP( D_CHAT_LIT( "--EChatClientCmdExit is %d" ),
+ ( TInt )EChatClientCmdExit );
+
+ switch ( aCommand )
+ {
+ case EAknCmdExit: // fall-through, handled similarily
+ case EEikCmdExit: // fall-through, handled similarily
+ case EAknSoftkeyExit: // fall-through, handled similarily
+ case EChatClientCmdExit:
+ {
+ if ( IsBackgroundTaskPendingL() )
+ {
+ iIsFSDExitNeeded = ETrue;
+ break;
+ }
+ else
+ {
+ iStopUpdateCba = EFalse;
+ }
+
+ CHAT_DP_FUNC_DP( "HandleCommandL", "exit command" );
+ // exit softkey: EAknSoftkeyExit
+ // exit from menu: EChatClientCmdExit
+ // forced exit (oom): EEikCmdExit
+ // forced exit (fastswap): EEikCmdExit
+
+ TInt ret( EAknSoftkeyOk );
+ TInt chatLoginType( IMUtils::WVSettingsChatLoginValue() );
+
+ if ( ( aCommand != EEikCmdExit ) &&
+ ( chatLoginType != EWVSettingsChatLoginAutoAlways ) &&
+ ( chatLoginType != EWVSettingsChatLoginAutoInHomeNW ) )
+ {
+ // don't show query if user is not logged in or if this
+ // is a forced exit
+ // checking login status only when needed, ie. no need
+ // check if forced exit or login type is always online
+ if ( iUISessionManager->IsLoggedIn() )
+ {
+ CCAGlobalNoteHandler* note = CCAGlobalNoteHandler::NewL();
+ CleanupStack::PushL( note );
+
+ ret = note->ShowNoteL( R_QTN_CHAT_CLOSE_CONN_APP_CONV );
+ CleanupStack::PopAndDestroy( note );
+ ReleaseCapturingL();
+ }
+ }
+ else if ( aCommand != EEikCmdExit )
+ {
+ iUISessionManager->LoginL( MCAUiLoginCmdCB::EExit );
+ }
+
+ // Check what the user responded
+ if ( ( ret == EAknSoftkeyOk ) || ( ret == EAknSoftkeyYes ) )
+ {
+ iEngine.GetBlockingInterface()->SetAppUiExitFlag( ETrue );
+ iQueryAccepted = ETrue;
+ CHAT_DP_FUNC_DP( "HandleCommandL", "Dismissing wait dialog..." );
+ DismissWaitDialogL( KErrNone );
+ CHAT_DP_FUNC_DP( "HandleCommandL", "done" );
+ CHAT_DP_FUNC_DP( "HandleCommandL", "ShutDialogsL..." );
+ AknDialogShutter::ShutDialogsL( *iEikonEnv );
+ CHAT_DP_FUNC_DP( "HandleCommandL", "done." );
+ CHAT_DP_FUNC_DP( "HandleCommandL", "IMUIPIconForcedClear..." );
+ IMUIPIConForcedClear();
+ CHAT_DP_FUNC_DP( "HandleCommandL", "done" );
+ CHAT_DP_FUNC_DP( "HandleCommandL", "CancelAllRequests..." );
+ iProcessManager.GetLogInInterface()->CancelAllRequests();
+ CHAT_DP_FUNC_DP( "HandleCommandL", "done" );
+ // Reset soft notification counter so that
+ // the note does not pop up after exit.
+ CHAT_DP_FUNC_DP( "HandleCommandL", "Reset SoftNotif count.." );
+ TRAPD( err, SetSoftNotificationCounterL( 0 ) );
+
+ if ( err )
+ {
+ CActiveScheduler::Current()->Error( err );
+ }
+ if ( ( chatLoginType != EWVSettingsChatLoginAutoAlways ) &&
+ ( chatLoginType != EWVSettingsChatLoginAutoInHomeNW ) )
+ {
+ CHAT_DP_FUNC_DP( "HandleCommandL", "LogoutL..." );
+ TRAP( err, iUISessionManager->LoginL( MCAUiLoginCmdCB::ELogout ) );
+ if ( err )
+ {
+ CActiveScheduler::Current()->Error( err );
+ }
+ CHAT_DP_FUNC_DP( "HandleCommandL", "done..." );
+
+ }
+
+ // If we have some asynchronously launched dialogs, we need
+ // to give them time to return.
+ if ( iProcessManager.GetLogInInterface()->ReadyForShutdown() && iPendingDialogCounter <= 0 )
+ {
+ TInt level = LevelOfActiveScheduler();
+ if( level > 1 )
+ {
+ CActiveScheduler::Current()->Stop();
+ }
+ CHAT_DP_FUNC_DP( "HandleCommandL",
+ "Engine is ready for shutdown & no async dialogs pending" );
+ Exit();
+ }
+ else
+ {
+ CHAT_DP_FUNC_DP( "HandleCommandL",
+ "Engine is NOT ready for shutdown or async dialogs pending" );
+ CHAT_DP_FUNC_DP( "HandleCommandL", "Starting exitIdle." );
+ if ( !iExitIdle->IsActive() )
+ {
+ iExitIdle->Start( TCallBack( ExitCallback, this ) );
+ }
+ }
+ }
+ else
+ {
+ // Connection and application is not closed.
+ // Go to application shell.
+ /*ActivateViewL( KAknApplicationShellViewId );*/
+ TApaTaskList taskList(CCoeEnv::Static()->WsSession());
+ TApaTask chatng = taskList.FindApp( KUidChatClient );
+
+ // Send the IM to background
+ chatng.SendToBackground();
+ }
+
+ break;
+ }
+ case EChatClientMainViewCmdLogin:
+ {
+ TBool loginDone = EFalse;
+ TRAPD( err, loginDone = iUISessionManager->LoginL( MCAUiLoginCmdCB::ELogin ) );
+ if ( err != KErrNone || ! loginDone )
+ {
+ // got some error, build the views before passing leave code
+ // forward
+ FinalizeChatConstructionL();
+ if ( err != KErrNone )
+ {
+ // IMPS Common UI has shown the error notes
+ User::Leave( err );
+ }
+ }
+
+ break;
+ }
+ case EChatClientMainViewCmdLogout:
+ {
+ iProcessManager.GetLogInInterface()->CancelAllRequests();
+ iUISessionManager->LoginL( MCAUiLoginCmdCB::ELogout );
+ break;
+ }
+ case EChatPrivateListCmdSettings: // fall-through, handled similarily
+ case EChatClientMainViewSettings: // fall-through, handled similarily
+ case EChatClientChatListSettings:
+ {
+ if ( !IsBackgroundTaskPendingL() )
+ {
+ // check for backgroundtask complete or not
+#ifdef RD_SETTINGS_FACELIFT
+ LaunchServerSettingsDialogL();
+#else
+ SwitchViewL( KUidSettingsView );
+#endif
+
+ // When the settings dialog exit, set it back
+ iStopUpdateCba = EFalse;
+ }
+ break;
+ }
+ case EChatClientChatListViewCmdJoin:
+ {
+ SwitchViewL( KUidChatView );
+ break;
+ }
+ case EChatClientMainViewCmdChangeStatus:
+ {
+ ChangeStatusProcessL();
+ break;
+ }
+ case EChatClientCmdStatusMessage:
+ {
+
+ MCAMainViewArrayPC* mainViewArrayPC = iProcessManager.GetArrayInterface();
+ TInt topIndex( 0 ) ;
+ if ( mainViewArrayPC->GetType( topIndex ) == TEnumsPC::EOwnStatusItem )
+ {
+ AskStatusMessageL( mainViewArrayPC->GetOnlineStatus( topIndex ), ETrue );
+ }
+ break;
+ }
+ case EAknCmdHelp:
+ {
+ HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(),
+ AppHelpContextL() );
+ break;
+ }
+
+ default:
+ {
+ break;
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::DoHandleInvitationResponseL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::DoHandleInvitationResponseL( TBool aAcceptance,
+ const TDesC& aUserId,
+ const TDesC& aGroupName,
+ const TDesC& aResponse )
+ {
+ // load the title texts
+ HBufC* title = iEikonEnv->AllocReadResourceLC( R_QTN_CHAT_INVITE_RESPONSE );
+
+ TInt resourceId = R_QTN_CHAT_INVITE_REJECTED;
+ if ( aAcceptance )
+ {
+ resourceId = R_QTN_CHAT_INVITE_ACCEPT;
+ }
+
+ HBufC* acceptreject = iEikonEnv->AllocReadResourceLC( resourceId );
+
+ HBufC* group = iEikonEnv->AllocReadResourceLC( R_QTN_CHAT_INVITE_GROUP );
+ HBufC* message = iEikonEnv->AllocReadResourceLC( R_QTN_CHAT_INVITE_MESSAGE );
+
+ // find the identification for contact
+ TPtrC identification( DisplayId( aUserId ) );
+ identification.Set( iApplicationNGPC.Identification( aUserId ) );
+
+ // calculate the length of the buffer
+ TInt lfLength( KLineFeed().Length() );
+ TInt length(
+ message->Length() + lfLength +
+ aResponse.Length() + lfLength +
+
+ acceptreject->Length() + lfLength +
+ identification.Length() + lfLength +
+ group->Length() + lfLength +
+ aGroupName.Length()
+ );
+
+ HBufC* msgBuf = HBufC::NewLC( length );
+ TPtr msg( msgBuf->Des() );
+ msg.Zero();
+
+ if ( !aAcceptance && ( aResponse.Length() > 0 ) )
+ {
+ // rejected response has the reason also
+ msg.Append( message->Des() );
+ msg.Append( KLineFeed );
+ msg.Append( aResponse );
+ msg.Append( KLineFeed );
+ }
+
+ // accepted response (and the end of rejected response)
+ msg.Append( acceptreject->Des() );
+ msg.Append( KLineFeed );
+ msg.Append( identification );
+ msg.Append( KLineFeed );
+ msg.Append( group->Des() );
+ msg.Append( KLineFeed );
+ msg.Append( CCAPCUtils::DisplayId( aGroupName ) );
+
+ IMDialogUtils::DisplayMessageQueryDialogL(
+ R_CHATCLIENT_INVITE_RESPONSE_DIALOG,
+ msg, title->Des(),
+ ETrue // T9
+ );
+
+ CleanupStack::PopAndDestroy( 5, title ); // msgBuf, message, group, acceptreject, title
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::ReceivedMsgs
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CCAAppUi::ReceivedInvites() const
+ {
+ return iProcessManager.GetInvitationsInterface()->UnreadInvitesCount();
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::GroupUtils
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CCAGroupUtils* CCAAppUi::GroupUtils()
+ {
+ return iGroupUtils;
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::SetForwardMessageL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::SetForwardMessageL( const MCAConversationMessage* aFwdMessage )
+ {
+ // if NULL
+ if ( !aFwdMessage )
+ {
+ delete iForwardMessage;
+ iForwardMessage = NULL;
+ }
+ // if not the same message
+ else if ( iForwardMessage != aFwdMessage )
+ {
+ delete iForwardMessage;
+ iForwardMessage = NULL;
+ iForwardMessage = IMMessageUtilsPC::CloneMessageL( *aFwdMessage );
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::ForwardMessage
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+const MCAConversationMessage* CCAAppUi::ForwardMessage()
+ {
+ return iForwardMessage;
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::ShowWaitDialogL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::ShowWaitDialogL( const TDesC& aText,
+ TBool aShowImmediately /*= EFalse*/ )
+ {
+ if ( iWaitDialog )
+ {
+ // hide the previous dialog and wait for it to really disappear
+ DismissWaitDialogL( KErrNone, ETrue );
+ }
+
+ // start capturing the events
+ CaptureEventsL();
+ // show the dialog
+ iWaitDialogDismissed = EFalse;
+ iWaitDialog = new( ELeave )CAknWaitDialog( ( CEikDialog** )&iWaitDialog,
+ aShowImmediately );
+ iWaitDialog->PrepareLC( R_CHAT_WAIT_NOTE_TEMPLATE );
+ iWaitDialog->SetTone( CAknNoteDialog::ENoTone );
+ iWaitDialog->SetTextL( aText );
+ iWaitDialog->SetCallback( this );
+ iWaitDialog->RunLD(); // CSI: 50 # iWaitDialog is not owned by us
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::ShowWaitDialogLC
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::ShowWaitDialogLC( const TDesC& aText,
+ TBool aShowImmediately /* = EFalse */ )
+ {
+ ShowWaitDialogL( aText, aShowImmediately );
+ CleanupStack::PushL( TCleanupItem( CCAAppUi::CloseDialog, this ) );
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::ShowWaitDialogL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::ShowWaitDialogL( TInt aTextResource,
+ TBool aShowImmediately /*= EFalse*/ )
+ {
+ HBufC* text = iEikonEnv->AllocReadResourceLC( aTextResource );
+ ShowWaitDialogL( *text, aShowImmediately );
+ CleanupStack::PopAndDestroy( text );
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::ShowWaitDialogLC
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::ShowWaitDialogLC( TInt aTextResource,
+ TBool aShowImmediately /*= EFalse*/ )
+ {
+ ShowWaitDialogL( aTextResource, aShowImmediately );
+ CleanupStack::PushL( TCleanupItem( CCAAppUi::CloseDialog, this ) );
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::DismissWaitDialogL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::DismissWaitDialogL( TInt aErrorCode,
+ TBool aWaitUntilDismissed /*= EFalse*/,
+ const TDesC& aAdditionalData )
+ {
+ if ( iWaitDialog )
+ {
+ TRAPD( err, iWaitDialog->ProcessFinishedL() );
+ if ( err != KErrNone )
+ {
+ // don't know for sure that ProcessFinishedL deletes the dialog
+ // in all cases, so let's delete it
+ delete iWaitDialog;
+ iWaitDialog = NULL;
+ iWaitDialogDismissed = ETrue;
+ User::Leave( err );
+ }
+ else
+ {
+ // start waiting for actual hiding if requested
+ if ( !iWaitDialogDismissed && aWaitUntilDismissed )
+ {
+ if ( !iWait.IsStarted() )
+ {
+ iWait.Start(); // CSI: 10 # iWait is not an active object
+ }
+ }
+ }
+ // stop capturing the events
+ ReleaseCapturingL();
+ }
+
+ // leave on everything else but imps errors (and timeout)
+ if ( ( aErrorCode > Imps_ERROR_BASE ) && ( aErrorCode != KErrTimedOut )
+ && ( aErrorCode != KErrCancel ) )
+ {
+ User::LeaveIfError( aErrorCode );
+ }
+ else
+ {
+ // otherwise show error note, if this is really an error
+ IMNoteMapper::ShowNoteL( aErrorCode, aAdditionalData );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::IconLoader
+// Return iconloader
+// -----------------------------------------------------------------------------
+//
+CCAIconLoader& CCAAppUi::IconLoader() const
+ {
+ if ( !iIconLoader )
+ {
+ CActiveScheduler::Current()->Error( KErrNotFound );
+ }
+ return *iIconLoader;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::MessageHandler
+// Return message handler
+// -----------------------------------------------------------------------------
+//
+CCAMessageExtensionsHandler& CCAAppUi::MessageHandler() const
+ {
+ if ( !iMessageHandler )
+ {
+ CActiveScheduler::Current()->Error( KErrNotFound );
+ }
+ return *iMessageHandler;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::DisplayId
+// Hide some parts of userid/groupid/listid
+// -----------------------------------------------------------------------------
+//
+TPtrC CCAAppUi::DisplayId( const TDesC& aId, TBool aListHiding /* = EFalse */ )
+ {
+ return CCAPCUtils::DisplayId( aId, aListHiding );
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::ReadBrandedResourcesL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::ReadBrandedResourcesL()
+ {
+ // check if we have resource-file variated "wv:"-part showing support
+ // enabled and cache it to storage (everything uses that)
+ TInt hideWV = IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_HIDE_WV );
+ iApplicationNGPC.SetWVHiding( hideWV ? ETrue : EFalse );
+
+ // UI CR : Domain part showing. Only prefix hiding
+ TInt hideWVprefix = IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_HIDE_ONLY_PREFIX );
+ iApplicationNGPC.SetWVHidingPrefixOnly( hideWVprefix ? ETrue : EFalse );
+
+ TInt capitalEnabled = IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_CONTACT_LISTS_CAPITALIZED );
+ iApplicationNGPC.SetCapitalizingEnabled( capitalEnabled ? ETrue : EFalse );
+
+ // Not used in backported 3.0 environment
+ TInt overRideDefaultTone =
+ IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_OVERRIDE_DEFAULT_TONE );
+ if ( overRideDefaultTone && iUISessionManager )
+ {
+
+ // When application is started there might not be any SAPs defined,
+ // ignore KErrNotFound leave.
+ CIMPSSAPSettings* currentSap = NULL;
+ TRAPD( err,
+ currentSap = iUISessionManager->CurrentSAPLC();
+ // currentSap has to be popped before exiting TRAP harness
+ CleanupStack::Pop( currentSap );
+ ); // TRAPD
+
+ // Push it back to CleanupStack
+ CleanupStack::PushL( currentSap );
+
+ if ( err == KErrNone )
+ {
+ TPtrC currentTone;
+ TInt retVal =
+ currentSap->GetOpaqueDesC16( KIMAlertTonePath(), currentTone );
+ if ( retVal == KErrNotFound )
+ {
+ // Set default sound only once from resources
+ HBufC* tone = iCoeEnv->AllocReadResourceAsDes16LC( R_DEFAULT_TONE );
+ currentSap->SetOpaqueDesC16( KIMAlertTonePath(), *tone );
+ iSAPSettingsStore->UpdateOldSAPL( currentSap, currentSap->Uid() );
+ CleanupStack::PopAndDestroy( tone );
+ }
+ }
+
+ CleanupStack::PopAndDestroy( currentSap );
+ }
+ // this method is also done when we get a SAP change event
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::DialogDismissedL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::DialogDismissedL( TInt /*aButtonId*/ )
+ {
+ iWaitDialogDismissed = ETrue;
+ if ( iWait.IsStarted() )
+ {
+ iWait.AsyncStop();
+ }
+
+ // stop capturing the events
+ ReleaseCapturingL();
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::SwitchViewBackL( TUid aViewId )
+//
+// ---------------------------------------------------------
+//
+void CCAAppUi::SwitchViewBackL( TUid aViewId, TUid aCustomMessageId /* = NULL*/,
+ const TDesC8& aCustomMessage /* = KNullDesC*/ )
+ {
+ TInt switchViewIndex = iSwitchView.Count() - 1;
+ TInt switchMsgIndex = iSwitchMessage.Count() - 1;
+ TInt switchMsgContentIndex = iSwitchMessageContent.Count() - 1;
+
+ if ( switchViewIndex >= 0 && iSwitchMessageContent[ switchMsgContentIndex ] )
+ {
+ TRAPD( err, SwitchViewL( iSwitchView[ switchViewIndex ],
+ iSwitchMessage[ switchMsgIndex ],
+ *iSwitchMessageContent[ switchMsgContentIndex ] ) );
+
+ if ( iSwitchView[ switchViewIndex ] == KUidChatView ||
+ iSwitchView[ switchViewIndex ] == KUidConversationsView ||
+ iSwitchView[ switchViewIndex ] == KUidRecordedChatView )
+
+ {
+ iLastView = TUid::Uid( 0 );
+ }
+
+ iSwitchView[ switchViewIndex ] = TUid::Uid( 0 );
+ iSwitchMessage[ switchMsgIndex ] = TUid::Uid( 0 );
+
+ delete iSwitchMessageContent[ switchMsgContentIndex ];
+ iSwitchMessageContent[ switchMsgContentIndex ] = NULL;
+
+ iSwitchView.Remove( switchViewIndex );
+ iSwitchMessage.Remove( switchMsgIndex );
+ iSwitchMessageContent.Remove( switchMsgContentIndex );
+
+ User::LeaveIfError( err );
+
+ return;
+ }
+ else if ( switchViewIndex >= 0 && iSwitchView[ switchViewIndex ] !=
+ TUid::Uid( 0 ) )
+ {
+ SwitchViewL( iSwitchView[ switchViewIndex ] );
+ iSwitchView[ switchViewIndex ] = TUid::Uid( 0 );
+ iSwitchView.Remove( switchViewIndex );
+ return;
+ }
+
+ if ( iLastView != TUid::Uid( 0 ) & iLastView != KUidInvitationView )
+ {
+ SwitchViewL( iLastView, aCustomMessageId, aCustomMessage );
+ iLastView = TUid::Uid( 0 );
+ }
+ else
+ {
+ SwitchViewL( aViewId, aCustomMessageId, aCustomMessage );
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::SwitchViewL( TUid aViewId )
+// From MCAViewSwitcher, handles view-switch requests
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::SwitchViewL( TUid aViewId )
+ {
+ CHAT_DP( D_CHAT_LIT( "CCAAppUi::SwitchViewL, requested view: %d" ),
+ aViewId.iUid );
+
+ if ( iIsAppForeground )
+ {
+ CHAT_DP_FUNC_DP( "SwitchViewL", "Application was in foreground" );
+ TUid myLastView = ActiveViewId();
+ if ( myLastView != aViewId && myLastView != KUidRefreshView )
+ {
+ iLastView = myLastView;
+ }
+
+ ActivateLocalViewL( aViewId );
+
+ iOkToSwitch = EFalse;
+ }
+ else
+ {
+ iOkToSwitch = ETrue;
+ }
+
+ iActiveViewId = aViewId;
+ iCustomMessageId = KNullUid;
+ delete iCustomMessage;
+ iCustomMessage = NULL;
+
+ ReleaseCapturingL();
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::SwitchViewL
+// From MCAViewSwitcher, handles view-switch requests
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::SwitchViewL( TUid aViewId,
+ TUid aCustomMessageId,
+ const TDesC8& aCustomMessage )
+ {
+ CHAT_DP( D_CHAT_LIT(
+ "CCAAppUi::SwitchViewL, requested view: %d, messageID: %d, message: %S" ),
+ aViewId.iUid, aCustomMessageId.iUid, &aCustomMessage );
+
+ if ( iIsAppForeground )
+ {
+ CHAT_DP_FUNC_DP( "SwitchViewL", "Application was in foreground" );
+ TUid myLastView = ActiveViewId();
+ if ( myLastView != aViewId && myLastView != KUidRefreshView )
+ {
+ iLastView = myLastView;
+ }
+
+ ActivateLocalViewL( aViewId, aCustomMessageId, aCustomMessage );
+
+ iOkToSwitch = EFalse;
+ }
+ else
+ {
+ iOkToSwitch = ETrue;
+ }
+
+ HBufC8* tmp = aCustomMessage.AllocLC();
+ delete iCustomMessage;
+ iCustomMessage = tmp;
+ CleanupStack::Pop(); // tmp
+
+ iActiveViewId = aViewId;
+ iCustomMessageId = aCustomMessageId;
+
+ ReleaseCapturingL();
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::RegisterSwitchBack
+// From MCAViewSwitcher
+// ---------------------------------------------------------
+//
+void CCAAppUi::RegisterSwitchBack( TUid aViewId,
+ TUid aCustomMessageId,
+ HBufC8* aCustomMessage,
+ TUid aNextView )
+ {
+ TUid prevViewId;
+
+ if ( iSwitchView.Count() > 0 )
+ {
+ prevViewId = iSwitchView[ iSwitchView.Count() - 1 ];
+ }
+ else
+ {
+ prevViewId = KNullUid;
+ }
+
+ // Check if we are forwarding for the second time
+ if ( ( prevViewId == KUidChatView || prevViewId == KUidConversationsView )
+ && ( aViewId == KUidChatView || aViewId == KUidConversationsView ) )
+ {
+ if ( iSwitchView.Count() > 0 )
+ {
+ // remove the previous view
+ delete iSwitchMessageContent[ iSwitchMessageContent.Count()-1 ];
+ iSwitchMessageContent[ iSwitchMessageContent.Count()-1 ] = NULL;
+
+ iSwitchView.Remove( iSwitchView.Count() - 1 );
+ iSwitchMessage.Remove( iSwitchMessage.Count() - 1 );
+ iSwitchMessageContent.Remove( iSwitchMessageContent.Count() - 1 );
+ }
+
+ delete aCustomMessage;
+
+ if ( aNextView == KUidConversationsView )
+ {
+ // add the conversation list view.
+ iSwitchView.Append( KUidChatPrivateChatListView );
+ }
+ else // aNextView == KUidChatView
+ {
+ // add the chat group list view.
+ iSwitchView.Append( KUidChatListView );
+ }
+
+ iSwitchMessage.Append( KNullUid );
+ iSwitchMessageContent.Append( NULL );
+ }
+ else
+ {
+ // normal behaviour
+ iSwitchView.Append( aViewId );
+ iSwitchMessage.Append( aCustomMessageId );
+ iSwitchMessageContent.Append( aCustomMessage );
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::DeRegisterSwitchBack
+// From MCAViewSwitcher
+// ---------------------------------------------------------
+//
+void CCAAppUi::DeRegisterSwitchBack( TUid aViewId,
+ const TDesC& aTarget )
+ {
+ TInt index = 0;
+ TInt count = iSwitchView.Count();
+
+ // Check all views in queue
+ for ( ; index < count; index++ )
+ {
+ if ( aViewId == iSwitchView[index] )
+ {
+ TInt compare = -1;
+
+ // Check if this is view to be deregistered
+ if ( aViewId == KUidChatView )
+ {
+ TCADnlChatViewBuf viewBuf;
+ viewBuf.Copy( *iSwitchMessageContent[index] );
+ compare = CAUtils::NeutralCompare( aTarget, viewBuf().iGroupId );
+ }
+ else if ( aViewId == KUidConversationsView )
+ {
+ TCADnlConvViewBuf viewBuf;
+ viewBuf.Copy( *iSwitchMessageContent[index] );
+ compare = CAUtils::NeutralCompare( aTarget, viewBuf().iWVID );
+ }
+
+ // Deregister view
+ if ( compare == 0 )
+ {
+ iSwitchView.Remove( index );
+ iSwitchMessage.Remove( index );
+ delete iSwitchMessageContent[index];
+ iSwitchMessageContent.Remove( index );
+ count = iSwitchView.Count();
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::ViewExists
+// Checks if view exists
+// -----------------------------------------------------------------------------
+//
+TBool CCAAppUi::ViewExists( TUid aViewId )
+ {
+ if ( View( aViewId ) )
+ {
+ return ETrue;
+ }
+ return EFalse;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::ActiveViewId
+// -----------------------------------------------------------------------------
+//
+TUid CCAAppUi::ActiveViewId()
+ {
+ TVwsViewId viewId;
+ GetActiveViewId( viewId );
+ return viewId.iViewUid;
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::HandleResourceChangeL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::HandleResourceChangeL( TInt aType )
+ {
+ CAknViewAppUi::HandleResourceChangeL( aType );
+ if ( aType == KEikDynamicLayoutVariantSwitch )
+ {
+ // skin change for this app ui class
+ iLayoutInfo->LayoutChangedL( aType );
+
+ CalculatePreviewPaneWidth();
+
+ // Update skin layout
+ CCAVariantFactory* varFact =
+ static_cast<CCAApp*>( Application() )->VariantFactory();
+ varFact->SkinVariantL()->UpdateLayout();
+ }
+
+
+ if ( aType == KEikDynamicLayoutVariantSwitch ||
+ aType == KAknsMessageSkinChange )
+ {
+ TInt count( iLayoutObservers.Count() );
+ for ( TInt i( 0 ); i < count; ++i )
+ {
+ iLayoutObservers[i]->LayoutChangedL( aType );
+ }
+ // Set the icons
+ if ( iUISessionManager )
+ {
+ iUISessionManager->SetStatusPaneIconsL();
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::ConstructL
+// Symbian OS default constructor can leave.
+// ---------------------------------------------------------
+//
+void CCAAppUi::ConstructL()
+ {
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() starting" );
+
+ // The Settings are now stored in Cenrep, and it needs to be fetched using the instance of CRepository, so InitializeLibL will create the instance of CRepository
+ //using the instance of CRepository, so InitializeLibL will create the instance of CRepository
+ IMUtils::InitializeLibL();
+ iIsFSWExit = EFalse;
+ iDestructingFlag = EFalse;
+
+ BaseConstructL( EAknEnableSkin | ENoAppResourceFile |
+ EAppOrientationAutomatic | EAknEnableMSK );
+
+
+ //create Splash Screen
+ iSplashScreen = CCASplashScreen::NewL( this );
+ CAVersion::UpdateVersion( iCoeEnv->FsSession()
+ , KPrivateVersionFile
+ , KPublishedVersionFile );
+
+ // Get mem low note variation status
+ iShowMemLowNote =
+ ( IMUtils::CRKeyL( KCRUidIMVariation, KIMVariationKey )
+ & EIMFeatMemLowWarningNote );
+
+ // Read CR variation flag
+ iBrandableToneList =
+ ( IMUtils::CRKeyL( KCRUidIMVariation, KIMVariationKey )
+ & EIMFeatBrandableTones );
+
+ iStatusMessage = HBufC::NewL( KPEngMaxWVStatusTextLength );
+
+ iLayoutInfo = CCALayoutInfo::NewL( TChatListBoxLayout::EWithoutEditor );
+ iLayoutInfo->LayoutChangedL();
+
+ CalculatePreviewPaneWidth();
+
+ //Creating exit idle
+ iExitIdle = CIdle::NewL( CActive::EPriorityIdle );
+
+ FeatureManager::InitializeLibL();
+
+ /** CR - 106 - 1357
+ * KFeatureIdChatNG, if not supported, then we should not allow the
+ * Application to launch further, so we leave with an error
+ * "Feature Not Supported!".
+ */
+ if ( !FeatureManager :: FeatureSupported ( KFeatureIdChatNG ) )
+ {
+ User :: Leave ( KErrNotSupported );
+ }
+
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() featuremanager initialized" );
+
+ // Brand UI
+ CCAVariantFactory* varFact =
+ static_cast<CCAApp*>( Application() )->VariantFactory();
+
+ // CR : 101-39724 Error note needed when application cannot be opened because of the lack of the memory
+ MCAOpBrandVariant* opBrand = NULL ;
+ TRAPD( err, opBrand = varFact->OpBrandVariantL() );
+ if ( err )
+ {
+ // Using CErrorUI, which matches the errorcode passed with coreesponding error string
+ // and displays the note.
+ CErrorUI* errorUI = CErrorUI::NewLC( );
+ errorUI->ShowGlobalErrorNoteL( err );
+ CleanupStack::PopAndDestroy( errorUI );
+ User::Leave( err );
+ }
+
+ RetrieveBrandL( *opBrand );
+
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() brand retrieved" );
+
+ MCASkinVariant* skin = varFact->SkinVariantL();
+
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() skinvariant constructed" );
+
+ iIconLoader = CCAIconLoader::NewL( iChatMbmFullPath, *skin );
+
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() iconloader constructed" );
+
+ // Initialize Connection UI agent
+ iConnUIAgent = CIMPSConnectionUiAgent::NewL( EIMPSConnClientIM );
+
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() connuiagent constructed" );
+
+ iConnUIAgent->StartServiceL(
+ EIMPSQueryActiveConnectionScheduledClose );
+
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() connuiagent started 1" );
+
+ iConnUIAgent->StartServiceL(
+ EIMPSQueryActiveConnectionSuppressForScheduledConnection );
+
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() connuiagent started 2" );
+
+ iConnUIAgent->StartServiceL(
+ EIMPSReqisterAsSignificantConnectionClientInScheduling );
+
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() connuiagent started 3" );
+
+ iConnUIAgent->StartServiceL(
+ EIMPSNotifyActiveConnectionLostReasons );
+
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() connuiagent started 4" );
+
+ // SAP settings store
+ iSAPSettingsStore = CIMPSSAPSettingsStore::NewL();
+ //raj
+ iSAPSettingsStore->AddObserverL( this, EIMPSIMAccessGroup );
+
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() sapsettingstore constructed" );
+
+ // Initialize Universal Indicator Pane handling
+ InitializeUIPHandlingL();
+
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() uiphandling initialized" );
+
+ // Centralized handler for navi-pane changes
+ iStatusPaneHandler = CCAStatusPaneHandler::NewL();
+
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() statuspanehandler constructed" );
+
+ iConnUI = CIMPSPresenceConnectionUi::NewL( EIMPSConnClientIM );
+
+ // Audio manager for playing simple sounds
+ iAudioManager = CCAAudioManager::NewL( *iConnUI );
+
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() audiomanager constructed" );
+
+ // Input absorber
+ iInputAbsorber = CCAInputAbsorber::NewL();
+
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() inputabsorber constructed" );
+
+ // screen name holder
+ iScreenName = HBufC::NewL( KScreenNameMaxLength );
+
+ //Message extension handler. This must be created before views.
+ iMessageHandler = CCAMessageExtensionsHandler::NewL( *skin, *this );
+
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() messagehandler constructed" );
+
+ // Create just the main view. Other views are created when the engine
+ // has been fully constructed, since they depend on it. We can't
+ // create the engine now because it will boot up the IMPS Server which
+ // will take a long time.
+ //CAViewCreator::CreateMainViewL( *this );
+
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() main view created" );
+
+ // This has to be set before UISessionManager is created.
+ // Needed for branding purposes
+ // and for refresh view.
+ iActiveViewId = KUidFriendsListView;
+
+
+ // Create ui session manager (it takes care of needed UI sequences
+ // concerning UI construction)
+ iUISessionManager = CCAUISessionManager::NewL( *iConnUI, skin,
+ opBrand,
+ this,
+ this,
+ iStatusPaneHandler,
+ &MbmFullPath() );
+
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() UISessionManager constructed" );
+
+ // Show Splash Screen, if variated so
+ // IM client UI customization, phase 2
+ // Based on Variation flag, Display SplashScreen
+ TBool showSplashScreen = IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_SHOW_SPLASH_SCREEN );
+ if ( showSplashScreen )
+ {
+ ShowSplashScreenL( *skin );
+ }
+ else
+ {
+ SplashScreenShowed();
+ }
+
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::InitializeEngineObserversL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::InitializeEngineObserversL()
+ {
+ // engine is valid before this is called
+
+ MCAGlobalNotificationObserverPC& globalNotificationObserverPC ( *iProcessManager.GetGlobalNotificationInterface() );
+
+
+ globalNotificationObserverPC.AddGlobalObserverL( this );
+
+ //iEngine.MessageUtils().MessageErrorInformer().RegisterObserver( this );
+ iEngineInitialized = ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::FinalizeChatConstructionL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::FinalizeChatConstructionL()
+ {
+ if ( iChatFullyConstructed )
+ {
+ // we're already fully constructed
+ return;
+ }
+
+ iProcessManager.FinalizeEngineConstructionL();
+ InitializeEngineObserversL();
+ CAViewCreator::CreateOtherViewsL( *this );
+
+ iProcessManager.GetRecordedChatsArrayPC()->FinalizeRecChatsArrayPCConstructionL();
+ // after this call, chat application is now fully constructed
+ iChatFullyConstructed = ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::SetPlayOnce
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::SetPlayOnce( TBool aPlayOnce )
+ {
+ iPlayOnce = aPlayOnce;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::AfterRefreshViewId
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUid CCAAppUi::AfterRefreshViewId( const TUid& aPrevious )
+ {
+ if ( iDefaultRefreshInUse )
+ {
+ return aPrevious;
+ }
+ else
+ {
+ iDefaultRefreshInUse = ETrue;
+ return KUidFriendsListView;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::SplashScreenShowed
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::SplashScreenShowed()
+ {
+ // Create just the main view. Other views are created when the engine
+ // has been fully constructed, since they depend on it. We can't
+ // create the engine now because it will boot up the IMPS Server which
+ // will take a long time.
+ CAViewCreator::CreateMainViewL( *this );
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() main view created" );
+
+ iGroupUtils = CCAGroupUtils::NewLC( *this );
+ CleanupStack::Pop( iGroupUtils );
+
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() grouputils constructed" );
+
+ ReadBrandedResourcesL();
+
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() branded resources read" );
+
+
+ FinalizeChatConstructionL();
+
+ CCACommandManagerFactory* commandManagerFactory = CCACommandManagerFactory::InstanceL();
+
+ commandManagerFactory->InitializeSessionHandlerL( iProcessManager, *iUISessionManager );
+
+ StatusPane()->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL );
+
+ CHAT_DP_TXT( "CCAAppUi::ConstructL() ready" );
+
+
+ //create infopopup note controller
+ iInfoPopup = CAknInfoPopupNoteController::NewL();
+
+ iInfoPopup->AddObserverL( *this );
+
+ iPreviewMessageList = new ( ELeave ) CDesCArrayFlat( KArrayGranularity );
+
+ iFocusFlag = EFalse;
+
+ iQueryAccepted = EFalse;
+ iForward = TEnumsPC::EUnregistered;
+
+ iIsFSDExitNeeded = EFalse;
+
+ iLaunchSettingsDialogWait = EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::ShowSplashScreenL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::ShowSplashScreenL( MCASkinVariant& aSkinVariant )
+ {
+ // Read Splash Screen duration from resource
+ // IM client UI customization, phase 2
+ // Based on Variation flag, SplashScreen Display duration
+ TBool aSplashDelay = IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_SPLASH_SCREEN_DURATION );
+// TInt aSplashDelay = 4; //in seconds
+ /*
+ CFbsBitmap* bitmapmain = new (ELeave) CFbsBitmap();
+ CFbsBitmap* bitmapmask = new (ELeave) CFbsBitmap();
+ TSize size(240,320);
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+ AknsUtils::CreateAppIconLC(skin, TUid::Uid(EAknsMinorGenericQgnGrafShutdown), EAknsAppIconTypeContext,bitmapmain,bitmapmask);
+ // EAknsMajorScreensaver EAknsMinorGenericQgnPropImSmileysHappy EAknsMinorGenericQgnGrafShutdown EAknsAppIconType3D EAknsAppIconTypeList
+ AknIconUtils::SetSize(bitmapmain,size);
+ AknIconUtils::SetSize(bitmapmask,size);
+
+ CGulIcon *Icon = CGulIcon::NewL(bitmapmain,bitmapmask);
+ CleanupStack::Pop(2);
+ */
+ /*
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+ CGulIcon* Icon = AknsUtils::CreateGulIconL( AknsUtils::SkinInstance(),
+ KAknsIIDQgnPropSetButton,
+ AknIconUtils::AvkonIconFileName(),
+ EMbmAvkonQgn_prop_set_button,
+ EMbmAvkonQgn_prop_set_button_mask );
+ */
+ /*
+ CGulIcon* Icon = aSkinVariant.LoadBitmapL( EMbmChatngQgn_prop_im_smileys_happy,
+ EMbmChatngQgn_prop_im_smileys_happy_mask,
+ iChatMbmFullPath );
+ */
+ CFbsBitmap* bitmap;
+ CFbsBitmap* mask;
+ TSize size;
+ AknLayoutUtils::LayoutMetricsSize( AknLayoutUtils::EScreen, size );
+ AknIconUtils::CreateIconL( bitmap, mask, KFileName, EMbmChatngQgn_graf_im_splash_screen, EMbmChatngQgn_graf_im_splash_screen_mask );
+ AknIconUtils::SetSize( bitmap, size, EAspectRatioPreserved );
+ AknIconUtils::SetSize( mask, size, EAspectRatioPreserved );
+
+ CleanupStack::PushL( bitmap );
+ CleanupStack::PushL( mask );
+ CGulIcon* Icon = CGulIcon::NewL( bitmap, mask );
+ CleanupStack::Pop( 2 ); // bitmap and mask
+
+ iSplashScreen->ShowSplashScreenL( this, aSplashDelay, Icon, EFalse );
+ return;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::SetAfterRefreshMode
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::SetAfterRefreshMode( TBool aMode )
+ {
+ iDefaultRefreshInUse = aMode;
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::SolveResPathLC
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+HBufC* CCAAppUi::SolveResPathLC( const TDesC& aPathWithoutDrive ) const
+ {
+ CHAT_DP_TXT( "Before add resource file" );
+
+ TFileName path = Application()->AppFullName();
+ TDriveName drive( TParsePtrC( path ).Drive( ) ); // solve drive
+
+ // leave to stack, LC method
+ HBufC* resourceFilePath = HBufC::NewLC( KMaxResourcePathLength );
+ TPtr ptr( resourceFilePath->Des() );
+ ptr.Append( aPathWithoutDrive ); // without drive
+ ptr.Insert( 0, drive ); // insert drive
+
+ // NearestLanguageFile takes only TFileName
+ path.Zero();
+ path.Append( *resourceFilePath );
+
+ if ( path.Length() != 0 )
+ {
+ BaflUtils::NearestLanguageFile( iEikonEnv->FsSession(), path );
+ }
+
+ *resourceFilePath = path;
+
+ return resourceFilePath;
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::TabChangedL( TInt aIndex )
+// From MAknTabObserver, handles changes in the tabs groups.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::TabChangedL( TInt /*aIndex*/ )
+ {
+ /*
+ CHAT_DP( D_CHAT_LIT("Tab changed to index %d"), aIndex );
+ CAknTabGroup* tabGroup = CAStatusPane()->TabGroup();
+ if ( tabGroup )
+ {
+ tabGroup->SetActiveTabByIndex( aIndex );
+ }
+ */
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::HandleKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType)
+// From CEikAppUi, handles key events.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TKeyResponse CCAAppUi::HandleKeyEventL( const TKeyEvent& /* aKeyEvent */,
+ TEventCode /* aType */ )
+ {
+ return EKeyWasConsumed;
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::HandleForegroundEventL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::HandleForegroundEventL( TBool aForeground )
+ {
+ CHAT_DP_FUNC_ENTER( "HandleForegroundEventL" );
+
+ iIsAppForeground = aForeground;
+
+ if ( aForeground && iOkToSwitch )
+ {
+ // coming from background to foreground,
+ // so show the view
+ CHAT_DP_FUNC_DP( "HandleForegroundEventL",
+ "Going from background to foreground" );
+
+ if ( iCustomMessageId == KNullUid )
+ {
+ // no custom message
+ CHAT_DP_FUNC_DP( "HandleForegroundEventL", "No custom message" );
+ SwitchViewL( iActiveViewId );
+ }
+ else
+ {
+ // custom message
+ CHAT_DP_FUNC_DP( "HandleForegroundEventL", "Custom message" );
+ SwitchViewL( iActiveViewId, iCustomMessageId, *iCustomMessage );
+ }
+ }
+ else
+ {
+ CHAT_DP_FUNC_DP( "HandleForegroundEventL", "Custom message" );
+ }
+
+ if ( !aForeground )
+ {
+ // application switched to background, update softnotifier
+ if ( iEngine.IsFinalized() )
+ {
+ // Universal indicator is not shown when one new message is received
+ UpdateIMUIPIcon();
+ }
+
+ // Set to false -> beep is played next time when
+ // new msg is received
+ iPlayOnce = EFalse;
+ }
+ else
+ {
+ // Disable IM's system attribute. After this call, IM is again under normal
+ // memory management. It might get killed if more memory is needed by the fw.
+ iEikonEnv->SetSystem( EFalse );
+ }
+
+ CAknViewAppUi::HandleForegroundEventL( aForeground );
+
+ CHAT_DP_FUNC_DONE( "HandleForegroundEventL" );
+ }
+
+
+// ---------------------------------------------------------
+// CCAAppUi::HandleChatEvent
+// (other items were commented in a header).
+// ---------------------------------------------------------
+void CCAAppUi::HandleChatEvent( const TEnumsPC::TChatEventType aEvent,
+ const TDesC& aWvid,
+ const TDesC& aContactId,
+ const TDesC& aMessage,
+ const TEnumsPC::TMessagerType aMsgrType,
+ const TEnumsPC::TMessageType aMsgType )
+ {
+ CHAT_DP_FUNC_ENTER( "CCAAppUi::HandleChatEvent" );
+ switch ( aEvent )
+ {
+ case TEnumsPC::EUnreadCountChanged:
+ {
+
+ //if message was not sent then wvid will be KNullDesC
+ //then dont check for aMsgrType, aMsgType
+ //also dont show the preview pane
+ if ( aWvid.Length() )
+ {
+ // own message
+ if ( aMsgrType == TEnumsPC::EMessageSent
+ // not PtoP message
+ || aMsgType == TEnumsPC::EMessageInvalid )
+ {
+ return;
+ }
+ //play the message tone
+ PlayBeep();
+
+ TBool showPreview( EFalse );
+
+ if ( aMsgType == TEnumsPC::EMessagePTOP )
+ {
+ //conversation message
+ MCAConversationPC& convPC( *iProcessManager.GetConversationInterface() );
+ showPreview = !convPC.IsActiveConversation( aWvid ) ;
+ }
+ else
+ {
+ //rest are group chat related messages
+ MCAGroupPC& groupPC ( *iProcessManager.GetGroupInterface() );
+ showPreview = !groupPC.IsActiveGroupChat( aWvid ) ;
+
+ }
+
+ //check if the new message is for the current active conversation only
+ //if the current active view is conversation -
+ if ( showPreview )
+ {
+ //show preview pane only if the message is not for the
+ //current active conversation
+
+ TRAP_IGNORE(
+ {
+ AddToPreviewListL( aContactId, aMessage );
+ if ( !iInfoNoteShowing )
+ {
+ ShowInfoPopupL();
+ }
+
+ }
+
+ );
+ }
+ }
+ //update the universal indicator
+ //shows the universal indicator
+ UpdateIMUIPIcon();
+ break;
+ }
+
+ case TEnumsPC::EMemoryLow:
+ {
+ if ( iShowMemLowNote )
+ {
+ TRAPD( err, ShowMemLowNoteL() );
+ if ( err )
+ {
+ CActiveScheduler::Current()->Error( err );
+ }
+ }
+ break;
+ }
+ default:
+ {
+ // No need to handle other events here
+ break;
+ }
+ }
+ CHAT_DP_FUNC_DONE( "CCAAppUi::HandleChatEvent" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::ChangeStatusProcessL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::ChangeStatusProcessL()
+ {
+ if ( iStatusFlag )
+ {
+ return;
+ }
+
+ iStatusFlag = ETrue;
+ if ( iUISessionManager->IsLoggedIn() )
+ {
+ // Check variation
+ TInt showAppearOffline =
+ IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_APPEAR_OFFLINE );
+ TInt showAway =
+ IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_AWAY_STATUS );
+ TInt showBusy =
+ IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_BUSY_STATUS );
+
+ TInt awayIndex( 0 );
+ TInt busyIndex( 0 );
+ TInt appOfflineIndex( 0 );
+
+ // first icon is online
+ // calculate indexes for other icons
+ if ( showAway )
+ {
+ awayIndex++;
+ busyIndex++;
+ appOfflineIndex++;
+ }
+ else
+ {
+ awayIndex = -1;
+ }
+
+ if ( showBusy )
+ {
+ busyIndex++;
+ appOfflineIndex++;
+ }
+ else
+ {
+ busyIndex = -1;
+ }
+
+ if ( showAppearOffline )
+ {
+ appOfflineIndex++;
+ }
+ else
+ {
+ appOfflineIndex = -1;
+ }
+
+ TInt status( 0 );
+ CAknListQueryDialog* dlg = new ( ELeave )
+ CAknListQueryDialog( &status );
+ dlg->PrepareLC( R_CHAT_STATUS_CHANGE_DLG );
+
+ // Format the texts
+ // Create a array for texts
+ CDesCArray* listItemsArray =
+ new ( ELeave ) CDesCArrayFlat( KAmountOfOwnStatusStates );
+ CleanupStack::PushL( listItemsArray );
+
+ // Online
+ HBufC* onlineText = NULL;
+ onlineText = StringLoader::LoadLC( R_CHAT_CHANGE_OWN_ONLINE );
+
+ HBufC* itemTxtOnline =
+ HBufC::NewLC( KTabFormatLenght + onlineText->Length() );
+ TPtr itemTxtPtrOnline( itemTxtOnline->Des() );
+
+ itemTxtPtrOnline.Format( KTabFormat, KOnlineIconIndex );
+ itemTxtPtrOnline.Append( *onlineText );
+ listItemsArray->AppendL( itemTxtPtrOnline );
+ CleanupStack::PopAndDestroy( itemTxtOnline );
+ CleanupStack::PopAndDestroy( onlineText );
+
+ // Away
+ if ( showAway )
+ {
+ HBufC* awayText = NULL;
+ awayText = StringLoader::LoadLC( R_CHAT_CHANGE_OWN_AWAY );
+
+ HBufC* itemTxtAway = HBufC::NewLC(
+ KTabFormatLenght + awayText->Length() );
+ TPtr itemTxtPtrAway( itemTxtAway->Des() );
+
+ itemTxtPtrAway.Format( KTabFormat, awayIndex );
+ itemTxtPtrAway.Append( *awayText );
+ listItemsArray->AppendL( itemTxtPtrAway );
+ CleanupStack::PopAndDestroy( itemTxtAway );
+ CleanupStack::PopAndDestroy( awayText );
+ }
+
+ // Busy
+ if ( showBusy )
+ {
+ HBufC* busyText = NULL;
+ busyText = StringLoader::LoadLC( R_CHAT_CHANGE_OWN_BUSY );
+
+ HBufC* itemTextBusy = HBufC::NewLC(
+ KTabFormatLenght + busyText->Length() );
+ TPtr itemTxtPtrBusy( itemTextBusy->Des() );
+
+ itemTxtPtrBusy.Format( KTabFormat, busyIndex );
+ itemTxtPtrBusy.Append( *busyText );
+ listItemsArray->AppendL( itemTxtPtrBusy );
+ CleanupStack::PopAndDestroy( itemTextBusy );
+ CleanupStack::PopAndDestroy( busyText );
+ }
+ // Appear offline
+ if ( showAppearOffline )
+ {
+ HBufC* offlineText = NULL;
+ offlineText = StringLoader::LoadLC( R_CHAT_CHANGE_OWN_APPEAR_OFFLINE );
+
+ HBufC* itemTextOffline = HBufC::NewLC(
+ KTabFormatLenght + offlineText->Length() );
+ TPtr itemTxtPtrOffline( itemTextOffline->Des() );
+
+ itemTxtPtrOffline.Format( KTabFormat, appOfflineIndex );
+ itemTxtPtrOffline.Append( *offlineText );
+ listItemsArray->AppendL( itemTxtPtrOffline );
+ CleanupStack::PopAndDestroy( itemTextOffline );
+ CleanupStack::PopAndDestroy( offlineText );
+ }
+
+ // Set the array
+ dlg->SetOwnershipType( ELbmOwnsItemArray );
+ CleanupStack::Pop( listItemsArray );
+ dlg->SetItemTextArray( listItemsArray );
+
+ // Add icons
+ CArrayPtr< CGulIcon >* icons = new( ELeave )
+ CAknIconArray( KAmountOfOwnStatusStates );
+ CleanupStack::PushL( icons );
+
+ MCASkinVariant* skinVar = static_cast<CCAApp*>(
+ Application() )->VariantFactory()->SkinVariantL();
+
+ // Online
+ CGulIcon* iconOnline = skinVar->LoadBitmapL(
+ EMbmChatngQgn_prop_im_friend_on,
+ EMbmChatngQgn_prop_im_friend_on_mask,
+ MbmFullPath() );
+ CleanupStack::PushL( iconOnline );
+ icons->AppendL( iconOnline );
+ CleanupStack::Pop( iconOnline );
+
+ // Away
+ CGulIcon* iconAway = NULL;
+ if ( showAway )
+ {
+ iconAway = skinVar->LoadBitmapL(
+ EMbmChatngQgn_prop_im_friend_away,
+ EMbmChatngQgn_prop_im_friend_away_mask,
+ MbmFullPath() );
+ CleanupStack::PushL( iconAway );
+ icons->AppendL( iconAway );
+ CleanupStack::Pop( iconAway );
+ }
+
+ // Busy
+ CGulIcon* iconBusy = NULL;
+ if ( showBusy )
+ {
+ iconBusy = skinVar->LoadBitmapL(
+ EMbmChatngQgn_prop_im_friend_busy,
+ EMbmChatngQgn_prop_im_friend_busy_mask,
+ MbmFullPath() );
+ CleanupStack::PushL( iconBusy );
+ icons->AppendL( iconBusy );
+ CleanupStack::Pop( iconBusy );
+ }
+ // Appear offline
+ CGulIcon* iconOffline = NULL;
+ if ( showAppearOffline )
+ {
+ iconOffline = skinVar->LoadBitmapL(
+ EMbmChatngQgn_prop_im_friend_invisible,
+ EMbmChatngQgn_prop_im_friend_invisible_mask,
+ MbmFullPath() );
+ CleanupStack::PushL( iconOffline );
+ icons->AppendL( iconOffline );
+ CleanupStack::Pop( iconOffline );
+ }
+
+ dlg->SetIconArrayL( icons ); // transfers ownership
+ CleanupStack::Pop( icons );
+
+ // get own status
+
+ TInt presenceStatus( TEnumsPC::EUnknown );
+ MCAMainViewArrayPC* mainViewArrayPC = iProcessManager.GetArrayInterface();
+ TInt topIndex( 0 );
+ if ( mainViewArrayPC->GetType( topIndex ) == TEnumsPC::EOwnStatusItem )
+ {
+ presenceStatus = mainViewArrayPC->GetOnlineStatus( topIndex ) ;
+ }
+ // get dialog's listbox
+ CEikListBox* listBox = dlg->ListBox();
+
+ // move focus in the listbox to current status
+ switch ( presenceStatus )
+ {
+ case TEnumsPC::EOnline:
+ {
+ listBox->SetCurrentItemIndex( 0 );
+ break;
+ }
+ case TEnumsPC::EAway:
+ {
+
+ if ( showAway || showBusy || showAppearOffline )
+ {
+ listBox->SetCurrentItemIndex( 1 );
+ }
+ break;
+ }
+ case TEnumsPC::EBusy:
+ {
+ if ( showBusy )
+ {
+ listBox->SetCurrentItemIndex( busyIndex );
+ }
+ else
+ {
+ if ( showAway )
+ {
+ // Show as away if busy is disabled
+ listBox->SetCurrentItemIndex( awayIndex );
+ }
+ else
+ {
+ listBox->SetCurrentItemIndex( 0 );
+ }
+
+ }
+ break;
+ }
+ case TEnumsPC::EInvisible:
+ {
+ if ( showAppearOffline )
+ {
+ // index of invisible is 3 if busy is visible, else 2.
+ if ( showAway )
+ {
+ listBox->SetCurrentItemIndex( showBusy ? 3 : 2 );
+ }
+ else
+ {
+ // away is not shown, index is 2 or 1
+ listBox->SetCurrentItemIndex( showBusy ? 2 : 1 );
+ }
+ }
+ else
+ {
+ if ( showAway )
+ {
+ // invisible, but appear offline disabled,
+ // so show as "away"
+ listBox->SetCurrentItemIndex( 1 );
+ }
+ else
+ {
+ // invisible, but appear offline and away disabled,
+ // so show as online
+ listBox->SetCurrentItemIndex( 0 );
+ }
+ }
+ break;
+ }
+ default:
+ {
+ // nothing to do
+ break;
+ }
+ }
+
+ TInt result = dlg->RunLD();
+
+ TInt error( KErrNone );
+ if ( ( result == EAknSoftkeyOk ) ||
+ ( result == EAknSoftkeySelect ) )
+ {
+ if ( status == 0 )
+ {
+ TInt autoStatusMsgEnabledForOnline = IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_ONLINE_AUTO );
+ if ( autoStatusMsgEnabledForOnline )
+ {
+ error = AskStatusMessageL( TEnumsPC::EOnline, EFalse );
+ }
+ if ( error == KErrNone )
+ {
+ CCAWaitNote* note = CCAWaitNote::ShowWaitNoteLC( R_QTN_CHAT_CHANGE_STATUS_CHANGING );
+ error = mainViewArrayPC->ChangeStatusL(
+ TEnumsPC::EOnline, *iStatusMessage );
+ CleanupStack::PopAndDestroy( note );
+ }
+ }
+ if ( status == awayIndex ) /* Away */
+ {
+ // can't get here unless Away is enabled
+ TInt autoStatusMsgEnabledForAway =
+ IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_AWAY_AUTO );
+ if ( autoStatusMsgEnabledForAway )
+ {
+ error = AskStatusMessageL( TEnumsPC::EAway, EFalse );
+ }
+ if ( error == KErrNone )
+ {
+ CCAWaitNote* note = CCAWaitNote::ShowWaitNoteLC( R_QTN_CHAT_CHANGE_STATUS_CHANGING );
+ error = mainViewArrayPC->ChangeStatusL(
+ TEnumsPC::EAway, *iStatusMessage );
+ CleanupStack::PopAndDestroy( note );
+ }
+ }
+
+ if ( status == busyIndex ) // Busy
+ {
+ // can't get here unless Busy is enabled
+ TInt autoStatusMsgEnabledForBusy =
+ IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_BUSY_AUTO );
+ if ( autoStatusMsgEnabledForBusy )
+ {
+ error = AskStatusMessageL( TEnumsPC::EBusy, EFalse );
+ }
+ if ( error == KErrNone )
+ {
+ CCAWaitNote* note = CCAWaitNote::ShowWaitNoteLC( R_QTN_CHAT_CHANGE_STATUS_CHANGING );
+ error = mainViewArrayPC->ChangeStatusL(
+ TEnumsPC::EBusy, *iStatusMessage );
+ CleanupStack::PopAndDestroy( note );
+ }
+ }
+ if ( status == appOfflineIndex ) //Offline
+ {
+ // can't get here unless Appear Offline is enabled
+ CCAWaitNote* note = CCAWaitNote::ShowWaitNoteLC( R_QTN_CHAT_CHANGE_STATUS_CHANGING );
+ error = mainViewArrayPC->ChangeStatusL(
+ TEnumsPC::EOffline, KNullDesC );
+ CleanupStack::PopAndDestroy( note );
+ }
+
+
+ if ( error == KErrNone )
+ {
+ // show confirmation note
+ HBufC* text = iCoeEnv->AllocReadResourceLC( R_QTN_CHAT_CHANGE_STATUS_CHANGED );
+ CAknConfirmationNote* dlg = new( ELeave )CAknConfirmationNote();
+ dlg->ExecuteLD( *text );
+ CleanupStack::PopAndDestroy( text );
+ }
+ else if ( error == KErrCancel )
+ {
+ // user cancelled, status was not updated
+ IMDialogUtils::DisplayInformationNoteL( R_QTN_CHAT_CHANGE_STATUS_NOT_CHANGED );
+ }
+ else
+ {
+ // change status failed
+ HBufC* failed = StringLoader::LoadLC( R_QTN_CHAT_CHANGE_STATUS_FAILED );
+ IMDialogUtils::DisplayErrorNoteL( *failed );
+ CleanupStack::PopAndDestroy( failed );
+ }
+ }
+ else
+ {
+ IMDialogUtils::DisplayInformationNoteL( R_QTN_CHAT_CHANGE_STATUS_NOT_CHANGED );
+ }
+ iStatusFlag = EFalse;
+
+ iUISessionManager->SetStatusPaneIconsL();
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::AskStatusMessageL()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CCAAppUi::AskStatusMessageL( TEnumsPC::TOnlineStatus aStatus,
+ TBool aUpdateToNetwork )
+ {
+ CDesCArray* statusMessages = new( ELeave )CDesCArrayFlat( KMaxStatusMessageCount );
+ CleanupStack::PushL( statusMessages );
+
+ HBufC* firstLine = StringLoader::LoadLC( R_QTN_CHAT_CHANGE_NEW_MESSAGE );
+ statusMessages->AppendL( *firstLine );
+ CleanupStack::PopAndDestroy( firstLine );
+
+ // Read status messages
+ ReadStatusMessagesL( aStatus, *statusMessages );
+
+ // show the query
+ TInt selectionIndex( statusMessages->Count() > 1 ? 1 : 0 );
+
+ // Force to continue if selection query is not shown
+ TInt ret = EAknSoftkeyOk;
+
+ if ( selectionIndex == 1 )
+ {
+ // There were previous status messages, show selection query
+ HBufC* titleText = StringLoader::LoadLC( R_QTN_CHAT_CHANGE_SELECT_MESSAGE );
+ ret = IMDialogUtils::DisplayListQueryDialogL( &selectionIndex, statusMessages,
+ R_PRIVATE_CHAT_LIST_SELECT_RECIP_DLG,
+ *titleText, KNullDesC, ETrue );
+ CleanupStack::PopAndDestroy( titleText );
+ }
+
+ if ( !( ret == EAknSoftkeyOk || ret == EAknSoftkeyDone || ret == EAknSoftkeySelect ) )
+ {
+ CleanupStack::PopAndDestroy( statusMessages );
+ return KErrCancel;
+ }
+
+ TPtr statusTxt( iStatusMessage->Des() );
+ statusTxt.Zero();
+
+ if ( selectionIndex != 0 )
+ {
+ statusTxt.Copy( ( *statusMessages ) [ selectionIndex ] );
+ }
+
+ TInt result = IMDialogUtils::DisplayTextQueryDialogL(
+ statusTxt ,
+ R_CHAT_ENTER_STATUS_MESSAGE,
+ R_CHATCLIENT_ENTER_STATUS_MESSAGE_QUERY,
+ ETrue, // T9
+ ETrue // LSK always visible
+ );
+
+ if ( ( result == EAknSoftkeyOk || result == EAknSoftkeyDone ) && ( iUISessionManager->IsLoggedIn() ) )
+ {
+ CHAT_DP( D_CHAT_LIT( "iStatusMessage = %S" ), iStatusMessage );
+
+ // Delete first line.
+ statusMessages->Delete( 0 );
+ statusMessages->InsertL( 0, statusTxt );
+ WriteStatusMessagesL( aStatus, *statusMessages );
+ if ( aUpdateToNetwork )
+ {
+ CCAWaitNote* note = CCAWaitNote::ShowWaitNoteLC( R_CHAT_CHANGE_MESSAGE_CHANGING );
+
+ MCAMainViewArrayPC* mainViewArrayPC = iProcessManager.GetArrayInterface();
+ TInt error( mainViewArrayPC->ChangeStatusMessageL( statusTxt ) );
+ CleanupStack::PopAndDestroy( note );
+ if ( error == KErrNone )
+ {
+ // show note qtn_chat_change_message_changing
+ IMDialogUtils::DisplayInformationNoteL( R_CHAT_CHANGE_MESSAGE_CHANGED );
+ }
+ else if ( error == KErrCancel )
+ {
+ IMDialogUtils::DisplayInformationNoteL( R_CHAT_CHANGE_MESSAGE_NOT_CHANGED );
+ }
+ else
+ {
+ IMDialogUtils::DisplayInformationNoteL( R_CHAT_CHANGE_MESSAGE_FAILED );
+ }
+ }
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy( statusMessages );
+ return KErrCancel;
+ }
+ CleanupStack::PopAndDestroy( statusMessages ); //statusMessages
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::ReadStatusMessagesL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::ReadStatusMessagesL( TEnumsPC::TOnlineStatus aStatus,
+ CDesCArray& aArray )
+ {
+ MCASettingsPC* settingsPC = iProcessManager.GetSettingsInterface();
+ if ( !settingsPC )
+ {
+ User::Leave( KErrNotReady );
+ }
+
+ RBuf buffer;
+
+ buffer.Assign( settingsPC->GetSapSettingValuePCL(
+ ConvertToTEnumsStatusMsgValue( aStatus ) ) );
+
+ TBuf< KStatusMessageHeaderLength > header;
+ CleanupClosePushL( buffer );
+
+ TInt err( KErrNone );
+ TInt countOfMessages( 0 );
+ TInt offset( 1 ); // First character is for header length
+ TInt headerLength( 0 );
+ if ( buffer.Length() )
+ {
+ TLex lexer( buffer.Left( 1 ) );
+ err = lexer.Val( headerLength );
+ }
+ else
+ {
+ err = KErrEof;
+ }
+ while ( err == KErrNone && countOfMessages < KMaxStatusMessageCount )
+ {
+ TPtrC ptr( buffer.Mid( offset ) );
+ if ( ptr.Length() > headerLength )
+ {
+ header.Copy( ptr.Left( headerLength ) );
+ header.Trim();
+ TLex lexer( header );
+ offset += headerLength;
+ TInt messageLength( 0 );
+ err = lexer.Val( messageLength );
+ if ( err == KErrNone )
+ {
+ ptr.Set( buffer.Mid( offset ) );
+ if ( ptr.Length() >= messageLength )
+ {
+ aArray.AppendL( ptr.Left( messageLength ) );
+ offset += messageLength;
+ ++countOfMessages;
+ }
+ else
+ {
+ err = KErrEof;
+ }
+ }
+ }
+ else
+ {
+ err = KErrEof;
+ }
+ }
+ CleanupStack::PopAndDestroy(); // buffer
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::WriteStatusMessagesL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+
+void CCAAppUi::WriteStatusMessagesL( TEnumsPC::TOnlineStatus aStatus,
+ MDesCArray& aArray )
+ {
+ MCASettingsPC* settingsPC = iProcessManager.GetSettingsInterface();
+ if ( !settingsPC )
+ {
+ User::Leave( KErrNotReady );
+ }
+
+ TPtrC firstLine = aArray.MdcaPoint( 0 );
+ TInt countOfMessages( 0 );
+ TInt arrayCount( aArray.MdcaCount() );
+ TInt index( 0 );
+
+ RBuf buffer;
+ buffer.CreateL( RProperty::KMaxPropertySize );
+ CleanupClosePushL( buffer );
+
+ TBuf< KStatusMessageHeaderLength > header;
+
+ while ( index < arrayCount && countOfMessages < KMaxStatusMessageCount )
+ {
+ if ( index == 0 )
+ {
+ header.Format( KStatusMessageHeaderLengthFormat,
+ KStatusMessageHeaderLength );
+ buffer.Append( header );
+ }
+ TPtrC message = aArray.MdcaPoint( index );
+ if ( index == 0 || message.CompareF( firstLine ) != 0 )
+ {
+ header.Format( KStatusMessageHeaderFormat, message.Length() );
+ buffer.Append( header );
+ buffer.Append( message );
+ ++countOfMessages;
+ }
+ ++index;
+ }
+
+ settingsPC->SetSapSettingValuePCL( ConvertToTEnumsStatusMsgValue( aStatus ) , buffer );
+ CleanupStack::PopAndDestroy(); // buffer
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::ShowMemLowNoteL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::ShowMemLowNoteL()
+ {
+ // Don't launch note if one is already displayed
+ if ( !iMemLowNote )
+ {
+ // Give pointer to iMemLowNote to dialog ->
+ // gets nullified when dialog is destroyed
+ iMemLowNote = new( ELeave ) CAknNoteDialog(
+ &iMemLowNote,
+ CAknNoteDialog::EConfirmationTone );
+ iMemLowNote->PrepareLC( R_CHAT_MEM_LOW_NOTE );
+ // Pointer to dialog is needed as member
+ // variable to be able to know when dialog
+ // is destroyed
+ iMemLowNote->RunLD(); // CSI: 50 #see above
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::HandleContactDelete
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::HandleDelete( const TDesC& /*aContactId*/ , TEnumsPC::TItem /*aType*/ )
+ {
+ // Nothing to do
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::HandleAddition
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::HandleAddition( TEnumsPC::TItem /*aType*/ )
+ {
+ // Nothing to do
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::HandleChange
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::HandleChange( TEnumsPC::TItem /*aType*/,
+ TEnumsPC::TChange aChangeType )
+ {
+ if ( aChangeType == TEnumsPC::EChanged ||
+ aChangeType == TEnumsPC::EMultipleChanges )
+ {
+ TRAPD( err, iUISessionManager->SetStatusPaneIconsL() );
+ if ( err != KErrNone )
+ {
+ CActiveScheduler::Current()->Error( err );
+ }
+ }
+ }
+void CCAAppUi::HandleSettingsChangeL( TInt /*aChangedSettingEnum */ )
+ {
+ //Right now there is no implementation needed here
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::HandleWatcherEvent
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+/*void CCAAppUi::HandleWatcherEvent(const TDesC& aString ,
+ TEnumsPC::TOnlineStatus aOnlineStatus)
+ {
+ }*/
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::HandleMessageError
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::HandleMessageError( TInt aError, const TDesC& /*aInfo*/ )
+ {
+ if ( aError == KErrNoMemory )
+ {
+ TRAPD( err, IMNoteMapper::ShowNoteL( aError ) );
+ if ( err )
+ {
+ CActiveScheduler::Current()->Error( err );
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::HandleContactChange
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+/*void CCAAppUi::HandleContactChange( const TDesC& aContactId )
+ {
+ }*/
+
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::ExitCallback
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCAAppUi::ExitCallback( TAny* aInstance )
+ {
+ CHAT_DP_FUNC_ENTER( "ExitCallback" );
+ return static_cast<CCAAppUi*>( aInstance )->DoExitCallback();
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::DoExitCallback
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCAAppUi::DoExitCallback()
+ {
+ CHAT_DP_FUNC_ENTER( "DoExitCallback" );
+ if ( iProcessManager.GetLogInInterface()->ReadyForShutdown() && iPendingDialogCounter <= 0 )
+ {
+ TInt level = LevelOfActiveScheduler();
+ if( level > 1 )
+ {
+ CActiveScheduler::Current()->Stop();
+ }
+ CHAT_DP_FUNC_DP( "DoExitCallback", "Engine is ready for shutdown" );
+ Exit();
+ }
+ CHAT_DP_FUNC_DP( "DoExitCallback", "Engine is NOT ready for shutdown" );
+ return ETrue; //just a true value
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::CloseDialog
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::CloseDialog( TAny* aInstance )
+ {
+ TRAPD( leave, static_cast<CCAAppUi*>( aInstance )->DismissWaitDialogL( KErrNone ) );
+ if ( leave != KErrNone )
+ {
+ CActiveScheduler::Current()->Error( leave );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::RetrieveBrandL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::RetrieveBrandL( MCAOpBrandVariant& aBrand )
+ {
+ iChatMbmFullPath = Application()->BitmapStoreName();
+
+ TFileName appRes( Application()->ResourceFileName() );
+ _LIT( KResourceEngineFilePathWithoutDrive, "CaEngineNG.rsc" );
+ _LIT( KResourcePresenceFilePathWithoutDrive, "WVUIPresenceVariationNG.rsc" );
+ _LIT( KResourceVariationFilePathWithoutDrive, "CAVariationNG.rsc" );
+
+ TFileName engResPathWithoutDrive;
+ engResPathWithoutDrive.Zero();
+ engResPathWithoutDrive.Append( KDC_RESOURCE_FILES_DIR() );
+ engResPathWithoutDrive.Append( KResourceEngineFilePathWithoutDrive() );
+ HBufC* engResPath = SolveResPathLC( engResPathWithoutDrive );
+
+ TFileName presResPathWithoutDrive;
+ presResPathWithoutDrive.Zero();
+ presResPathWithoutDrive.Append( KDC_RESOURCE_FILES_DIR() );
+ presResPathWithoutDrive.Append( KResourcePresenceFilePathWithoutDrive() );
+ HBufC* presResPath = SolveResPathLC( presResPathWithoutDrive );
+
+ TFileName variationResPathWithoutDrive;
+ variationResPathWithoutDrive.Zero();
+ variationResPathWithoutDrive.Append( KDC_RESOURCE_FILES_DIR() );
+ variationResPathWithoutDrive.Append( KResourceVariationFilePathWithoutDrive() );
+ HBufC* variationResPath = SolveResPathLC( variationResPathWithoutDrive );
+
+
+
+ TPtrC cuiResPath( KNullDesC );
+ aBrand.RetrieveSavedSettingsL( iCoeEnv,
+ appRes,
+ *engResPath,
+ *presResPath,
+ *variationResPath,
+ cuiResPath,
+ MbmFullPath() );
+
+ CleanupStack::PopAndDestroy( 3, engResPath ); // variationResPath, presResPath, engResPath
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::InitializeUIPHandlingL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::InitializeUIPHandlingL()
+ {
+ // Connect to server
+ iNotifierAPI = CANotifierFactory::CreateNotifierL( NULL, KSDUidSysApLocal );
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::UpdateIMUIPIcon
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::UpdateIMUIPIcon()
+ {
+ TInt dummy( 0 );
+ TInt count( iApplicationNGPC.MessagesPendingCount( dummy,
+ TEnumsPC::EUnreadReceived ) +
+ iProcessManager.GetInvitationsInterface()->UnreadInvitesCount()
+ + iApplicationNGPC.ChatGroupMessagesPendingCount( dummy ) );
+ TInt error( iNotifierAPI->SetInt( MCANotifierInterface::EUIPIndKey, count ) );
+
+ if ( error )
+ {
+ CActiveScheduler::Current()->Error( error );
+ }
+
+ // Update unread message count to PS
+ // Value is used by the ImIndicatorPlugin
+ RProperty::Define(
+ KPSUidIMUI, KIMUnreadMsgKey, RProperty::EInt,
+ KIMUnreadMsgReadPolicy, KIMUnreadMsgWritePolicy );
+ RProperty::Set( KPSUidIMUI, KIMUnreadMsgKey, count );
+
+
+ //if count=iUnreadMsgCount then there is no need of soft notification
+ if ( !iIsAppForeground && count != iUnreadMsgCount )
+ {
+ // we show the soft notifaction only if chat is in backround
+ UpdateSoftNote( count );
+ iUnreadMsgCount = count;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::UpdateSoftNote
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::UpdateSoftNote( TInt aUnreadCount )
+ {
+ CHAT_DP_TXT( "CCAAppUi::UpdateSoftNote, signal SoftNotifier about new chat message!" );
+
+ TRAPD( err,
+ CAknSoftNotifier* softNotifier = CAknSoftNotifier::NewLC();
+ softNotifier->SetNotificationCountL( EChatMessageNotification, aUnreadCount );
+ CleanupStack::PopAndDestroy( softNotifier );
+ );
+
+ if ( err )
+ {
+ CActiveScheduler::Current()->Error( err );
+ CHAT_DP( D_CHAT_LIT( "CCAAppUi::UpdateSoftNote - softnotifier left with: %d" ), err );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::LayoutInfo
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+MCALayoutInfo* CCAAppUi::LayoutInfo()
+ {
+ return iLayoutInfo;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::SetRefreshed
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::SetRefreshed()
+ {
+ iRefreshed = ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::ListRefreshed
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CCAAppUi::ListRefreshed()
+ {
+ return iRefreshed;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::ChangeConnUiAgentResourceL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::ChangeConnUiAgentResourceL( const TDesC& aNewResource )
+ {
+ if ( iConnUIAgent )
+ {
+ iConnUIAgent->UseResourceFileL( aNewResource );
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::RefreshWaitFlag
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt& CCAAppUi::RefreshWaitFlag()
+ {
+ return iRefreshWaitFlag;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::IsUnderDestruction
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CCAAppUi::IsUnderDestruction()
+ {
+ return iDestructingFlag;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::DefaultServerId
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint32 CCAAppUi::DefaultSAPUid()
+ {
+ TUint32 SAPUid = 0;
+
+ //if there are no SAPs then don't try the get default server Id
+ if ( iSAPSettingsStore->SAPCountL( EIMPSIMAccessGroup ) > 0 )
+ {
+ CIMPSSAPSettings* sapSettings = CIMPSSAPSettings::NewLC();
+ TRAPD( err, iSAPSettingsStore->GetDefaultL( sapSettings, EIMPSIMAccessGroup ) );
+
+ if ( err == KErrNone )
+ {
+ SAPUid = sapSettings->Uid();
+ }
+ CleanupStack::PopAndDestroy( sapSettings );
+ }
+ return SAPUid;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::LaunchServerSettingsDialogL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::LaunchServerSettingsDialogL()
+ {
+ TFileName resPath;
+ TFileName resIMCUVarPath;
+
+ // resIMCUVarPath, is added to load the new resource file that contains the settings for IM UI.
+
+
+ // if there are no SAPs then don't try the get default
+ if ( iSAPSettingsStore->SAPCountL( EIMPSIMAccessGroup ) > 0 )
+ {
+ CIMPSSAPSettings* sap = static_cast<CCAAppUi*>( iEikonEnv->AppUi() )
+ ->UISessionManager().CurrentSAPLC();
+ TPtrC sapName( sap->SAPName() );
+ TPtrC wvSettRes( KWVSettingsResFileName );
+ TPtrC wvIMCUResVar( KIMPSCUVariationResFileName );
+
+ CCAVariantFactory* varFact =
+ static_cast<CCAApp*>( Application() )->VariantFactory();
+
+ // CR : 101-39724 Error note needed when application cannot be opened because of the lack of the memory
+ MCAOpBrandVariant* opBrand = NULL;
+ TRAPD( err, opBrand = varFact->OpBrandVariantL() );
+ if ( err )
+ {
+ // Using CErrorUI, which matches the errorcode passed with coreesponding error string
+ // and displays the note.
+ CErrorUI* errorUI = CErrorUI::NewLC( );
+ errorUI->ShowGlobalErrorNoteL( err );
+ CleanupStack::PopAndDestroy( errorUI );
+ User::Leave( err );
+ }
+
+ opBrand->CurrentResourceFileL( sapName, wvSettRes, resPath );
+ opBrand->CurrentResourceFileL( sapName, wvIMCUResVar, resIMCUVarPath );
+
+
+ if ( resPath.Length() != 0 )
+ {
+ BaflUtils::NearestLanguageFile( iEikonEnv->FsSession(), resPath );
+ }
+
+ if ( resIMCUVarPath.Length() != 0 )
+ {
+ BaflUtils::NearestLanguageFile( iEikonEnv->FsSession(), resIMCUVarPath );
+ }
+
+ CleanupStack::PopAndDestroy( sap );
+ }
+
+ TInt exitReason( 0 );
+ iServSettingsDialog = CWVSettingsUIDialog::NewL();
+
+ iUISessionManager->SetStatusPaneIconsL();
+
+ TBool loggedIn = iUISessionManager->IsLoggedIn();
+
+ TUint32 SAPUid1;
+ TUint32 SAPUid2;
+ SAPUid1 = DefaultSAPUid();
+
+ // CodeScanner warning ignored because
+ // iServSettingsDialog is not owned by us
+ TInt retVal( iServSettingsDialog->RunDialogLD( *iSAPSettingsStore, // CSI: 50 # See comment above
+ this,
+ resPath,
+ resIMCUVarPath,
+ exitReason,
+ this,
+ &iServSettingsDialog ) );
+
+ SAPUid2 = DefaultSAPUid();
+
+ if ( SAPUid1 != SAPUid2 )
+ {
+ iNeedRefresh = ETrue;
+ }
+
+ iServSettingsDialog = NULL;
+ iUISessionManager->SetStatusPaneIconsL();
+ // this is for updating settings view
+ if ( iNeedRefresh || ( loggedIn != iUISessionManager->IsLoggedIn() ) )
+ {
+ SwitchViewL( KUidRefreshView );
+ }
+
+ if ( retVal == EWVSettingsViewExitCalled )
+ {
+ HandleCommandL( EChatClientCmdExit );
+ }
+ }
+
+#ifdef RD_CHAT_GROUP_MESSAGE_INDICATION_NEW
+// ---------------------------------------------------------
+// CCAAppUi::IsFullyConstructed
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CCAAppUi::IsFullyConstructed() const
+ {
+ return iChatFullyConstructed;
+ }
+#endif // RD_CHAT_GROUP_MESSAGE_INDICATION_NEW
+
+#ifdef RD_SETTINGS_FACELIFT
+// ---------------------------------------------------------
+// CCAAppUi::IsSettingsDialogActive
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CCAAppUi::IsSettingsDialogActive() const
+ {
+ // CodeScanner warning ignored because we are not performing
+ // NULL equality checks here to check for validity of pointer.
+ // Check is needed to get boolean return value.
+ return iServSettingsDialog != NULL; // CSI: 64 # See above.
+ }
+#endif // RD_SETTINGS_FACELIFT
+
+// ---------------------------------------------------------
+// CCAAppUi::ReportPendingDialogClosed
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::ReportPendingDialogClosed()
+ {
+ // Counter must be over 1
+ __CHAT_ASSERT_DEBUG( iPendingDialogCounter > 0 );
+ iPendingDialogCounter--;
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::ReportPendingDialog
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::ReportPendingDialog()
+ {
+ iPendingDialogCounter++;
+ }
+// CCAAppUi::LaunchSettingsL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CCAAppUi::LaunchSettingsL ( CIMPSSAPSettings& aServer )
+ {
+ MCASettingsPC* SettingsPC = iProcessManager.GetSettingsInterface();
+ CCAAppSettingsDialog* dlg = new ( ELeave ) CCAAppSettingsDialog( *iStatusPaneHandler,
+ *SettingsPC,
+ *iUISessionManager,
+ &aServer );
+
+ CleanupStack::PushL( dlg );
+ dlg->ConstructL( R_CHATCLIENT_APPSETTINGS_MENUBAR );
+ CleanupStack::Pop( dlg );
+
+ return dlg->ExecuteLD( R_CHATCLIENT_APPSETTINGS_DLG );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::ServerChangedL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::ServerChangedL ( const TDesC& aNewServerName,
+ TBool aDefaultServerchanged /* =
+ EFalse */ )
+ {
+ CHAT_DP( D_CHAT_LIT( "CCAAppUi::ServerChangedL(%S)" ), &aNewServerName );
+ if ( aNewServerName.Length() == 0 ||
+ iSAPSettingsStore->SAPCountL( EIMPSIMAccessGroup ) == 0 )
+ {
+ // no servers
+ return;
+ }
+
+
+ iNeedRefresh = UISessionManager().BrandUIL( EFalse, aNewServerName );
+
+ // Stop here if brand did not actually change
+ if ( ! iNeedRefresh && ! iServSettingsDialog )
+ {
+ return;
+ }
+
+ // Update status-pane
+ UISessionManager().SetStatusPaneIconsL();
+
+ // Get resource file for settings dialog
+ TFileName resPath;
+ TFileName resIMCUVariationPath;
+
+ TPtrC resId( KWVSettingsResFileName() );
+ TPtrC resIMCUVariationId( KIMPSCUVariationResFileName() );
+
+ CCAVariantFactory* varFact =
+ static_cast<CCAApp*>( Application() )->VariantFactory();
+
+ // CR : 101-39724 Error note needed when application cannot be opened because of the lack of the memory
+ MCAOpBrandVariant* opBrand = NULL ;
+ TRAPD( err, opBrand = varFact->OpBrandVariantL() );
+ if ( err )
+ {
+ // Using CErrorUI, which matches the errorcode passed with coreesponding error string
+ // and displays the note.
+ CErrorUI* errorUI = CErrorUI::NewLC( );
+ errorUI->ShowGlobalErrorNoteL( err );
+ CleanupStack::PopAndDestroy( errorUI );
+ User::Leave( err );
+ }
+
+ opBrand->CurrentResourceFileL( aNewServerName, resId, resPath );
+ opBrand->CurrentResourceFileL( aNewServerName, resIMCUVariationId, resIMCUVariationPath );
+
+ if ( resPath.Length() != 0 )
+ {
+ BaflUtils::NearestLanguageFile( iEikonEnv->FsSession(), resPath );
+ }
+
+ if ( resIMCUVariationPath.Length() != 0 )
+ {
+ BaflUtils::NearestLanguageFile( iEikonEnv->FsSession(), resIMCUVariationPath );
+ }
+
+ CHAT_DP( D_CHAT_LIT( "CCAAppUi::ServerChangedL, signalling service settings about resPath: %S" ), &resPath );
+ if ( iServSettingsDialog )
+ {
+ iServSettingsDialog->ChangeResourceFileL( resPath, resIMCUVariationPath );
+ }
+ // Change resource file in iConnUIAgent
+ resPath.Zero();
+ TPtrC resId2( KIMPSConnUIResFileName() );
+ opBrand->CurrentResourceFileL( aNewServerName, resId2, resPath );
+ if ( resPath.Length() > 0 )
+ {
+ BaflUtils::NearestLanguageFile( iEikonEnv->FsSession(), resPath );
+ ChangeConnUiAgentResourceL( resPath );
+ }
+ if ( aDefaultServerchanged )
+ {
+ iProcessManager.GetArrayInterface()->ResetArray( ETrue );
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::CurrentServerNameLC
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+HBufC* CCAAppUi::CurrentServerNameLC()
+ {
+ HBufC* sapName = NULL;
+ TRAPD( err,
+ CIMPSSAPSettings* sap = UISessionManager().CurrentSAPLC();
+ // CodeScanner warning ignored because sapName is pushed to
+ // cleanupstack later and there is no leaving code before it
+ sapName = sap->SAPName().AllocL(); // CSI: 35 # See comment above
+ CleanupStack::PopAndDestroy( sap );
+ );
+
+ if ( err != KErrNone || !sapName )
+ {
+ sapName = KNullDesC().AllocL();
+ }
+
+ CleanupStack::PushL( sapName );
+ return sapName;
+ }
+
+
+// ---------------------------------------------------------
+// CCAAppUi::ConvertStatusToStatusMsgValue
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TEnumsPC::TCASettingStrings CCAAppUi::ConvertToTEnumsStatusMsgValue(
+ TEnumsPC::TOnlineStatus aStatus )
+ {
+ // Map status to setting item
+ switch ( aStatus )
+ {
+ case TEnumsPC::EAway:
+ {
+ return TEnumsPC::EStatusMsgAway;
+ // no need to break after return
+ }
+ case TEnumsPC::EBusy:
+ {
+ return TEnumsPC::EStatusMsgBusy;
+ // no need to break after return
+ }
+ case TEnumsPC::EOnline: // flowthrough
+ default:
+ {
+ return TEnumsPC::EStatusMsgOnline;
+ // no need to break after return
+ }
+ }
+ }
+
+
+// ---------------------------------------------------------
+// CCAAppUi::ShowInfoPopupL()
+// ---------------------------------------------------------
+//
+void CCAAppUi::ShowInfoPopupL()
+ {
+ iInfoPopup->HideInfoPopupNote();
+
+ HBufC* previewBuffer = HBufC::NewLC( iTotalPreviewMsgLength + ( 3 * KLineFeed().Length() ) );
+
+ TPtr msgPtr( previewBuffer->Des() );
+
+ for ( TInt index( iPreviewMessageList->Count() - 1 ); index >= 0; --index )
+ {
+ msgPtr.Append( iPreviewMessageList->MdcaPoint( index ) );
+ msgPtr.Append( KLineFeed );
+ }
+
+ iPreviewMessageList->Reset();
+ iInfoPopup->SetTextL( msgPtr );
+ CleanupStack::PopAndDestroy(); //previewBuffer
+ iTotalPreviewMsgLength = 0;
+ iInfoNoteShowing = ETrue;
+ iInfoPopup->ShowInfoPopupNote();
+
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::HandleInfoPopupNoteEvent()
+// ---------------------------------------------------------
+//
+void CCAAppUi::HandleInfoPopupNoteEvent( CAknInfoPopupNoteController* /*aController*/,
+ TAknInfoPopupNoteEvent aEvent )
+ {
+
+ switch ( aEvent )
+ {
+ case EInfoPopupNoteShown:
+ {
+ iInfoNoteShowing = ETrue;
+ break;
+ }
+ case EInfoPopupNoteHidden:
+ {
+
+ iInfoNoteShowing = EFalse;
+
+ if ( iPreviewMessageList->Count() )
+ {
+ //play the message tone and show preview pane
+ PlayBeep();
+ TRAP_IGNORE( ShowInfoPopupL() );
+ }
+
+ break;
+ }
+ default:
+ break;
+ }
+
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::AddToPreviewListL()
+// ---------------------------------------------------------
+//
+void CCAAppUi::AddToPreviewListL( const TDesC& aContactId, const TDesC& aMsg )
+ {
+ CDesCArray* array = new( ELeave )CDesCArrayFlat( 2 ); // two items
+ CleanupStack::PushL( array );
+ array->AppendL( aContactId );
+ array->AppendL( aMsg );
+
+
+ HBufC* msg = StringLoader::LoadLC( R_QTN_CHAT_MESSAGE_PREVIEW,
+ *array );
+ TPtr msgPtrTmp( msg->Des() );
+
+ TInt numOfChars = iCurrentFont->TextCount( msgPtrTmp, iPreviewPaneRect.Width() );
+
+ TPtrC msgPtr( KNullDesC() );
+ msgPtr.Set( msg->Left( numOfChars ) );
+
+ iTotalPreviewMsgLength += msgPtr.Length();
+
+ if ( iPreviewMessageList->Count() == 3 )
+ {
+ iPreviewMessageList->Delete( 0 );
+ }
+
+ iPreviewMessageList->AppendL( msgPtr );
+
+ CleanupStack::PopAndDestroy( 2, array );
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::CalculatePreviewPaneWidth()
+// ---------------------------------------------------------
+//
+void CCAAppUi::CalculatePreviewPaneWidth()
+ {
+ // Get parameter and table limits for popup preview text window
+ TAknLayoutScalableParameterLimits limits =
+ AknLayoutScalable_Avkon::popup_preview_text_window_ParamLimits();
+
+ TAknLayoutScalableTableLimits tableLimits =
+ AknLayoutScalable_Avkon::popup_preview_text_window_t_Limits();
+
+ // Get layout rects
+ TRect rectScreen = iAvkonAppUi->ApplicationRect();
+ TRect rectMainPane = rectScreen;
+
+ // Use first variety to be able to get the font for text parsing
+ TInt firstVariety = SelectWindowVariety( 1, limits );
+
+ TRect rectPopupWindow = RectFromLayout( rectMainPane,
+ AknLayoutScalable_Avkon::popup_preview_text_window( firstVariety ) );
+
+ TInt firstIndex = tableLimits.FirstIndex();
+ TInt firstLineVariety = AknLayoutScalable_Avkon::
+ popup_preview_text_window_t_ParamLimits( firstIndex ).FirstVariety();
+
+ TAknTextLineLayout popupTextLayout =
+ AknLayoutScalable_Avkon::popup_preview_text_window_t(
+ firstIndex, firstLineVariety );
+
+ TAknLayoutText layoutText;
+ layoutText.LayoutText( rectPopupWindow, popupTextLayout );
+
+ iPreviewPaneRect = layoutText.TextRect();
+
+ iCurrentFont = const_cast<CFont*> ( layoutText.Font() );
+
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::SelectWindowVariety()
+// ---------------------------------------------------------
+//
+TInt CCAAppUi::SelectWindowVariety( const TInt aNumberOfLines,
+ const TAknLayoutScalableParameterLimits& aLimits ) const
+ {
+ TInt index = aNumberOfLines - 1;
+ if ( Layout_Meta_Data::IsLandscapeOrientation() )
+ {
+ index += 5;
+ }
+
+ return Min( Max( index, aLimits.FirstVariety() ),
+ aLimits.LastVariety() );
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::RectFromLayout()
+// ---------------------------------------------------------
+//
+TRect CCAAppUi::RectFromLayout( const TRect& aParent,
+ const TAknWindowComponentLayout& aComponentLayout ) const
+ {
+ TAknWindowLineLayout lineLayout = aComponentLayout.LayoutLine();
+ TAknLayoutRect layoutRect;
+ layoutRect.LayoutRect( aParent, lineLayout );
+ return layoutRect.Rect();
+ }
+
+
+// ---------------------------------------------------------
+// CCAAppUi::OfferTabEventL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TKeyResponse CCAAppUi::OfferTabEventL( const TKeyEvent&
+ aKeyEvent, TEventCode aType )
+ {
+
+ TKeyResponse keyResponse = EKeyWasConsumed;
+
+ CAknTabGroup* tabGroup = CAStatusPane()->TabGroup();
+
+ if ( tabGroup )
+ {
+ keyResponse = tabGroup->OfferKeyEventL( aKeyEvent, aType );
+ }
+
+ return keyResponse;
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::AddServerChangeObsL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+
+void CCAAppUi::AddServerChangeObsL( MCAServerChangeNotify* aObserver )
+ {
+ if ( aObserver )
+ {
+ User::LeaveIfError( iServerChangeNotify.Append( aObserver ) );
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::RemoveServerChangeObs
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::RemoveServerChangeObs( MCAServerChangeNotify* aObserver )
+ {
+ TInt status( iServerChangeNotify.Find( aObserver ) );
+ if ( status != KErrNotFound )
+ {
+ iServerChangeNotify.Remove( status );
+ iServerChangeNotify.Compress();
+ }
+
+ status = iServerChangeNotify.Count();
+ if ( status == 0 )
+ {
+ iServerChangeNotify.ResetAndDestroy();
+ iServerChangeNotify.Close();
+ }
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::HandleSAPEvent
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::HandleSAPEvent( TSAPEvent aEvent )
+ {
+ if ( aEvent == ESAPSettingChanged )
+ {
+ TInt count = iServerChangeNotify.Count();
+ TRAP_IGNORE(
+ {
+ for ( TInt i = 0; i < count; i++ )
+ {
+ if ( ( !iSAPSettingsStore->SAPCountL( EIMPSIMAccessGroup ) ) )
+ {
+ iServerChangeNotify[i]->HandleServerChangeL( MCAServerChangeNotify::ENoServer );
+ }
+
+ else
+ {
+ iServerChangeNotify[i]->HandleServerChangeL( MCAServerChangeNotify::EOtherChange );
+ }
+ }
+ }
+ );
+ }
+
+ }
+// ---------------------------------------------------------
+// CCAAppUi::SetFocusFlag
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCAAppUi::SetFocusFlag( TBool aFlag )
+ {
+ iFocusFlag = aFlag;
+ }
+// ---------------------------------------------------------
+// CCAAppUi::FocusFlag
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CCAAppUi::FocusFlag()
+ {
+ return iFocusFlag;
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::IsBackgroundTaskPending
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CCAAppUi::IsBackgroundTaskPendingL()
+ {
+ // When the settings dialog or the exit begins, set it true
+ iStopUpdateCba = ETrue;
+ TBool ret = EFalse;
+
+ CHAT_DP_TXT( "CCAAppUi::IsBackgroundTaskPendingL started" );
+
+ MCALoginPC* loginPC = iProcessManager.GetLogInInterface();
+
+ iBackgroundTaskPending = loginPC->IsBackgroundTaskPending();
+
+ // check for group synch state
+ if ( iBackgroundTaskPending )
+ {
+ loginPC->RegisterBackGroundTaskObserver( this );
+
+ ret = WaitToCompleteBackgroundTaskL();
+
+ }
+
+ CHAT_DP_TXT( "CCAAppUi::IsBackgroundTaskPendingL completed" );
+
+ return ret;
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::HandleBackGroundTaskComplete
+// (other items were commented in a header).
+// ---------------------------------------------------------
+
+void CCAAppUi::HandleBackGroundTaskCompleteL( TBool aCompleted )
+ {
+
+ CHAT_DP_TXT( "CCAAppUi::HandleBackGroundTaskComplete started" );
+
+ MCALoginPC* loginPC = iProcessManager.GetLogInInterface();
+
+ iBackgroundTaskPending = aCompleted;
+
+ if ( !iBackgroundTaskPending ) //group synchro is complete
+ {
+ // hide wait note
+ if ( iWaitVisible )
+ {
+ TRAPD( err, DismissWaitDialogL( KErrNone ) );
+ if ( err != KErrNone )
+ {
+ User::Leave( err );
+ }
+ iWaitVisible = EFalse;
+ }
+
+ loginPC->UnRegisterBackGroundTaskObserver( this );
+
+ if ( iIsFSDExitNeeded )
+ {
+ HandleCommandL( EEikCmdExit );
+ iIsFSDExitNeeded = EFalse;
+ }
+
+ else
+ {
+ // every thinh is ok ,now call actual operation now
+#ifdef RD_SETTINGS_FACELIFT
+ LaunchServerSettingsDialogL();
+#else
+ SwitchViewL( KUidSettingsView );
+#endif
+ // When the settings dialog exit, set it back
+ iStopUpdateCba = EFalse;
+ }
+ }
+ if ( iIsFSDExitNeeded )
+ {
+ HandleCommandL( EEikCmdExit );
+ iIsFSDExitNeeded = EFalse;
+ }
+ CHAT_DP_TXT( "CCAAppUi::HandleBackGroundTaskComplete done" );
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::WaitToCompleteBackgroundTask
+// (other items were commented in a header).
+// ---------------------------------------------------------
+
+TBool CCAAppUi::WaitToCompleteBackgroundTaskL()
+ {
+ CHAT_DP_TXT( "CCAAppUi::WaitToCompleteBackgroundTask started" );
+
+ if ( ! iWaitVisible && iBackgroundTaskPending )
+ {
+ CHAT_DP_TXT(
+ "CCASessionHandler::GroupSyncL - ! iWaitVisible && iGroupSyncProgress" );
+ // launch the wait note
+ iWaitVisible = ETrue;
+
+ ShowWaitDialogL( R_QTN_CHAT_SEARCHVIEW_PROCESSING, ETrue );
+
+ CHAT_DP_TXT( "CCAAppUi::WaitToCompleteBackgroundTask done" );
+ }
+ return ETrue;
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::IsQueryAccepted
+// (other items were commented in a header).
+// ---------------------------------------------------------
+TBool CCAAppUi::IsQueryAccepted()
+ {
+ return iQueryAccepted;
+ }
+// ---------------------------------------------------------
+// CCAAppUi::IsQueryAccepted
+// (other items were commented in a header).
+// ---------------------------------------------------------
+void CCAAppUi::SetResetForwardTo( TEnumsPC::TForwardStatus aForward )
+ {
+ iForward = aForward;
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::IsQueryAccepted
+// (other items were commented in a header).
+// ---------------------------------------------------------
+TEnumsPC::TForwardStatus CCAAppUi::RetForwardTo()
+ {
+ return iForward;
+ }
+
+// ---------------------------------------------------------
+// CCAAppUi::IsQueryAccepted
+// (other items were commented in a header).
+// ---------------------------------------------------------
+void CCAAppUi::UnRegisterPreviousview()
+ {
+ TInt index = 0;
+ TInt count = iSwitchView.Count();
+
+ // Check all views in queue
+ for ( ; index < count; index++ )
+ {
+ if ( index == count - 1
+ && ( iSwitchView[ index ] == KUidChatView ||
+ iSwitchView[ index ] == KUidConversationsView ||
+ iSwitchView[ index ] == KUidRecordedChatView ) )
+ {
+ iLastView = TUid::Uid( 0 );
+ iSwitchView[ index ] = TUid::Uid( 0 );
+ iSwitchMessage[ index ] = TUid::Uid( 0 );
+ delete iSwitchMessageContent[ index ];
+ iSwitchMessageContent[ index ] = NULL;
+
+ iSwitchView.Remove( index );
+ iSwitchMessage.Remove( index );
+ iSwitchMessageContent.Remove( index );
+ count = iSwitchView.Count();
+ }
+ }
+ }
+#ifdef RD_MULTIPLE_DRIVE
+// -----------------------------------------------------------------------------
+// CCAAppUi::GetDriveStatusL()
+// Check the status of the drive.
+// -----------------------------------------------------------------------------
+//
+
+TBool CCAAppUi::GetDriveStatusL( const TDriveNumber aDriveNumber )
+ {
+ RFs& fs = CCoeEnv::Static()->FsSession();
+ _LIT( KFat, "Fat" );
+
+ // Check if the drive is already mounted
+ TFullName fsName;
+ TInt error( fs.FileSystemName( fsName, aDriveNumber ) );
+ if ( error )
+ {
+ return EFalse;
+ }
+
+ // check if MMC already mounted
+ if ( fsName.Length() == 0 )
+ {
+ // MMC drive isnt mounted at present, so try it now....
+ error = fs.MountFileSystem( KFat, aDriveNumber );
+
+ // If it's a locked MMC and the password is already known it'll be
+ // unlocked automatically when it's mounted., otherwise the mount will
+ // return with KErrLocked.....
+ switch ( error )
+ {
+ case KErrNone:
+ case KErrLocked:
+ {
+ break;
+ }
+ default:
+ {
+ return EFalse;
+ }
+ }
+ }
+ TDriveInfo driveInfo;
+ error = fs.Drive( driveInfo, aDriveNumber );
+ if ( error )
+ {
+ return EFalse;
+ }
+
+ // MMC is in slot
+ if ( driveInfo.iMediaAtt & KMediaAttLocked )
+ {
+ return EFalse;
+ }
+
+ TVolumeInfo volumeInfo;
+ error = fs.Volume( volumeInfo, aDriveNumber );
+ if ( error )
+ {
+ return EFalse;
+ }
+
+ // If type is remote drive and aConnectionState is required
+ if ( driveInfo.iDriveAtt & KDriveAttRemote )
+ {
+ TChar driveLetter;
+ fs.DriveToChar( aDriveNumber, driveLetter );
+ // This statement migth cause leave.. to be solved
+ CRsfwMountMan* mountMgr = CRsfwMountMan::NewL( 0, NULL );
+ TRsfwMountInfo mountInfo;
+ error = mountMgr->GetMountInfo( driveLetter, mountInfo );
+ delete mountMgr;
+
+ if ( error )
+ {
+ return EFalse;
+ }
+ }
+ return ETrue;
+ }
+#endif
+// -----------------------------------------------------------------------------
+// CCAAppUi::GetStopUpdateCba()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CCAAppUi::GetStopUpdateCba()
+ {
+ return iStopUpdateCba;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::GetIsFSWExitFlag()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CCAAppUi::GetIsFSWExitFlag()
+ {
+ return iIsFSWExit;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::SetFSWExitFlag()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppUi::SetFSWExitFlag( TBool aValue )
+ {
+ iIsFSWExit = aValue;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::CKludgeScheduler::PublicLevel()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCAAppUi::CKludgeScheduler::PublicLevel() const
+ {
+ return Level();
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::LevelOfActiveScheduler()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCAAppUi::LevelOfActiveScheduler()
+ {
+ return STATIC_CAST( CCAAppUi::CKludgeScheduler*,
+ CActiveScheduler::Current() )->PublicLevel();
+ }
+// End of File
+
+