messagingappbase/mcesettings/src/MceSettingsSessionObserver.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/mcesettings/src/MceSettingsSessionObserver.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,459 @@
+/*
+* Copyright (c) 2002 - 2007 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:  
+*     Message centre's settings session observer
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <ErrorUI.h> // CErrorUI
+#include <aknappui.h> // iAvkonAppUi
+#include <avkon.mbg>
+
+#include <mtudreg.h>
+#include <MTMStore.h>
+#include <MsgArrays.h> // CUidNameArray
+#include <msvids.h>
+#include <msvuids.h>
+
+#include <MuiuMsvUiServiceUtilities.h> // MsvUiServiceUtilities
+#include <MuiuMsvProgressReporterOperation.h>
+#include <akninputblock.h> // CAknInputBlock
+#include <SenduiMtmUids.h>
+
+#include "MceSettingsSessionObserver.h"
+
+// CONSTANTS
+
+const TInt KMceArrayGranularity = 4;
+const TInt KMceVisibleTextLength = KHumanReadableNameLength;
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ----------------------------------------------------
+// CMceSettingsSessionObserver::Constructor
+// ----------------------------------------------------
+CMceSettingsSessionObserver::CMceSettingsSessionObserver( CMsvSession* aSession )
+    :
+    iSession( aSession ),
+    iDeleteSession( EFalse )
+    {
+    }
+
+// ----------------------------------------------------
+// CMceSettingsSessionObserver::Constructor
+// ----------------------------------------------------
+void CMceSettingsSessionObserver::ConstructL()
+    {
+    if ( !iSession )
+        {
+        iSession = CMsvSession::OpenSyncL( *this );
+        iDeleteSession = ETrue;
+        }
+    iUiRegistry = CMtmUiDataRegistry::NewL( *iSession );
+    iMtmStore = CMtmStore::NewL( *iSession );
+    iRootEntry=CMsvEntry::NewL(
+        *iSession,
+        KMsvRootIndexEntryId,
+        TMsvSelectionOrdering( KMsvNoGrouping, EMsvSortByNone, ETrue ) );
+    }
+
+// ----------------------------------------------------
+// CMceSettingsSessionObserver::Constructor
+// ----------------------------------------------------
+EXPORT_C CMceSettingsSessionObserver* CMceSettingsSessionObserver::NewL( CMsvSession* aSession )
+    {
+    CMceSettingsSessionObserver* self = new ( ELeave ) CMceSettingsSessionObserver( aSession );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;    
+    }
+
+// ----------------------------------------------------
+// CMceSettingsSessionObserver::Destructor
+// ----------------------------------------------------
+EXPORT_C CMceSettingsSessionObserver::~CMceSettingsSessionObserver()
+    {
+    delete iRunningOperation;
+    delete iUiRegistry;
+    delete iMtmStore;
+    delete iRootEntry;
+    if ( iDeleteSession )
+        {
+        delete iSession;
+        }
+    }
+
+
+// ----------------------------------------------------
+// CMceSettingsSessionObserver::Session
+// ----------------------------------------------------
+EXPORT_C CMsvSession& CMceSettingsSessionObserver::Session()
+    {
+    return *iSession;
+    }
+
+// ----------------------------------------------------
+// CMceSettingsSessionObserver::UiRegistry
+// ----------------------------------------------------
+EXPORT_C CMtmUiDataRegistry* CMceSettingsSessionObserver::UiRegistry() const
+    {
+    return iUiRegistry;
+    }
+
+// ----------------------------------------------------
+// CMceSettingsSessionObserver::MtmStore
+// ----------------------------------------------------
+EXPORT_C CMtmStore* CMceSettingsSessionObserver::MtmStore() const
+    {
+    return iMtmStore;
+    }
+
+// ----------------------------------------------------
+// CMceSettingsSessionObserver::HandleSessionEventL
+// ----------------------------------------------------
+void CMceSettingsSessionObserver::HandleSessionEventL( TMsvSessionEvent /*aEvent*/, 
+                                                                                          TAny* /*aArg1*/, 
+                                                                                          TAny* /*aArg2*/, 
+                                                                                          TAny* /*aArg3*/ )
+    {
+
+    }
+
+// ----------------------------------------------------
+// CMceSettingsSessionObserver::OpCompleted
+// ----------------------------------------------------
+void CMceSettingsSessionObserver::OpCompleted( CMsvSingleOpWatcher& aOpWatcher, 
+                                                                            TInt aCompletionCode )
+    {
+    CMsvOperation* op=&aOpWatcher.Operation();
+    TRAP_IGNORE( DoOperationCompletedL( op, aCompletionCode ) );  
+
+    if ( iRunningOperation->Operation().Id() == op->Id() )
+        {
+        delete iRunningOperation;
+        iRunningOperation = NULL;
+        }
+    }
+
+// ----------------------------------------------------
+// CMceSettingsSessionObserver::DoOperationCompletedL
+// ----------------------------------------------------
+void CMceSettingsSessionObserver::DoOperationCompletedL(
+    CMsvOperation* aOperation, 
+    TInt aCompletionCode )
+    {
+    if ( !aOperation )
+        {
+        return;
+        }
+
+    if ( aCompletionCode == EEikCmdExit )
+        {
+        iAvkonAppUi->ProcessCommandL( EAknCmdExit );
+        return;
+        }
+
+    const TDesC8& progress = aOperation->ProgressL();
+
+    if ( progress.Length() == 0 )
+        {
+        return;
+        }
+
+    if ( aOperation->Mtm() != KUidMsvLocalServiceMtm )
+        {
+        CAknInputBlock::NewLC();
+        iMtmStore->GetMtmUiLC( aOperation->Mtm() ).DisplayProgressSummary( progress );            
+        CleanupStack::PopAndDestroy( 2 );  // CAknInputBlock, release mtmUi      
+        return;
+        }
+    
+    TMsvLocalOperationProgress localprogress = 
+        McliUtils::GetLocalProgressL( *aOperation );     
+
+    if ( ( aCompletionCode==KErrNone || aCompletionCode==KErrCancel) &&
+        ( localprogress.iError==KErrNone || localprogress.iError==KErrCancel ) )
+        {
+        return;
+        }
+
+    CErrorUI* errorUi = CErrorUI::NewL( *CCoeEnv::Static() );
+    CleanupStack::PushL( errorUi );
+    errorUi->ShowGlobalErrorNoteL( localprogress.iError?localprogress.iError:aCompletionCode );
+    CleanupStack::PopAndDestroy( errorUi );
+    }
+
+
+// ----------------------------------------------------
+// CMceSettingsSessionObserver::CanCreateNewAccountL
+// ----------------------------------------------------
+EXPORT_C TBool CMceSettingsSessionObserver::CanCreateNewAccountL( TUid aMtm )
+    {
+    TMsvEntry serviceEntry;
+    serviceEntry.iType=KUidMsvServiceEntry;
+    serviceEntry.iMtm=aMtm;
+    TInt rid;
+    CBaseMtmUiData& uiData = iMtmStore->MtmUiDataL( aMtm );
+    return uiData.CanCreateEntryL( iRootEntry->Entry(), serviceEntry, rid );
+    }
+
+// ----------------------------------------------------
+// CMceSettingsSessionObserver::DeleteAccountL
+// ----------------------------------------------------
+EXPORT_C void CMceSettingsSessionObserver::DeleteAccountL( TMsvId aId )
+    {
+    User::LeaveIfError( iRunningOperation ? KErrInUse : KErrNone );
+    TMsvEntry entry;
+    TMsvId serviceId;
+    User::LeaveIfError( iSession->GetEntry( aId, serviceId, entry ) );
+    const TUid mtm = entry.iMtm;
+    CBaseMtmUi* ui = &iMtmStore->ClaimMtmUiL( mtm );
+    if ( ui )
+        {
+        CMtmStoreMtmReleaser::CleanupReleaseMtmUiLC( *iMtmStore, mtm );
+        }
+
+    CMsvOperation* op = NULL;    
+
+// Request free disk space to be implemented
+    CMsvSingleOpWatcher* singleOpWatcher = CMsvSingleOpWatcher::NewL( *this );
+    CleanupStack::PushL( singleOpWatcher );
+    if ( ui )
+        {
+        ui->BaseMtm().SetCurrentEntryL( iSession->GetEntryL( KMsvRootIndexEntryId ) );
+        CAknInputBlock::NewLC();
+        op = ui->DeleteServiceL( entry, singleOpWatcher->iStatus );
+        CleanupStack::PopAndDestroy(); //CAknInputBlock
+        CleanupStack::PushL( op );
+        }
+    else
+        {
+        // could not load mtm, so delete as normal local entry
+        CMsvProgressReporterOperation* progOp = CMsvProgressReporterOperation::NewL(
+            *iSession, singleOpWatcher->iStatus, EMbmAvkonQgn_note_erased );
+        CleanupStack::PushL( progOp );
+
+        CMsvEntrySelection* selection = new( ELeave ) CMsvEntrySelection();
+        CleanupStack::PushL( selection );
+        selection->AppendL( entry.Id() );
+        CMsvOperation* subOp = iRootEntry->DeleteL( *selection, progOp->RequestStatus() );
+        CleanupStack::PopAndDestroy( selection );
+        progOp->SetOperationL( subOp ); // this takes ownership immediately, so no cleanupstack needed.
+        op = progOp;
+        CleanupStack::PushL( op );
+        }
+
+    CleanupStack::Pop( op );
+    CleanupStack::Pop( singleOpWatcher );
+    singleOpWatcher->SetOperation( op );
+    iRunningOperation = singleOpWatcher;    
+
+// Cancel the free disk space request to be implemented
+
+    if ( ui )
+        {
+        CleanupStack::PopAndDestroy();// release mtmUi
+        }
+    }
+
+// ----------------------------------------------------
+// CMceSettingsSessionObserver::CreateNewAccountL
+// ----------------------------------------------------
+EXPORT_C TBool CMceSettingsSessionObserver::CreateNewAccountL( TUid aMessageType, 
+                                                                           TMsvId aOldServiceId /* = KMsvNullIndexEntryId */)
+    {
+    LeaveIfDiskSpaceUnderCriticalLevelL();
+    User::LeaveIfError ( ( iRunningOperation ? KErrInUse : KErrNone ) );
+
+    TMsvEntry nentry;
+    nentry.iMtm = aMessageType;
+    nentry.iType.iUid = KUidMsvServiceEntryValue;
+    nentry.iDate.HomeTime();
+    nentry.iServiceId = aOldServiceId;
+
+    // --- Get the MTM UI relevant to the message type ---
+    CBaseMtmUi& mtmUi = iMtmStore->GetMtmUiLC( nentry.iMtm );
+    CMsvEntry* centry = iSession->GetEntryL( KMsvRootIndexEntryId );
+    CleanupStack::PushL( centry );
+    CAknInputBlock::NewLC();
+
+    CMsvSingleOpWatcher* singleOpWatcher = CMsvSingleOpWatcher::NewL( *this );
+    CleanupStack::PushL( singleOpWatcher );
+
+    CMsvOperation* op=mtmUi.CreateL(
+        nentry,
+        *centry,
+        singleOpWatcher->iStatus );
+
+    CleanupStack::PushL( op );
+    singleOpWatcher->SetOperation( op );
+    iRunningOperation = singleOpWatcher;
+    CleanupStack::Pop( op );
+    CleanupStack::Pop( singleOpWatcher );
+
+    TBool accountCreated = ( op->iStatus != KErrCancel );
+    // if not created, imum returns completed operation with KErrCancel
+
+    CleanupStack::PopAndDestroy(); // command absorb
+    CleanupStack::PopAndDestroy( centry );
+    CleanupStack::PopAndDestroy(); // mtm ui release
+    return accountCreated;
+    }
+
+
+// ----------------------------------------------------
+// CMceSettingsSessionObserver::EditAccountL
+// ----------------------------------------------------
+EXPORT_C void CMceSettingsSessionObserver::EditAccountL( TMsvId aId )
+    {
+    LeaveIfDiskSpaceUnderCriticalLevelL();
+    User::LeaveIfError ( ( iRunningOperation ? KErrInUse : KErrNone ) );
+
+    TMsvEntry entry;
+    TMsvId serviceId;
+    User::LeaveIfError( iSession->GetEntry( aId, serviceId, entry ) );
+
+    if ( entry.iType == KUidMsvServiceEntry )
+        {
+        CBaseMtmUi& mtmUi=iMtmStore->GetMtmUiAndSetContextLC( entry );
+        CAknInputBlock::NewLC();
+        CMsvSingleOpWatcher* singleOpWatcher=CMsvSingleOpWatcher::NewL( *this );
+        CleanupStack::PushL( singleOpWatcher );
+        CMsvOperation* op=mtmUi.EditL( singleOpWatcher->iStatus );
+        CleanupStack::PushL( op );
+        singleOpWatcher->SetOperation( op );
+        iRunningOperation = singleOpWatcher;
+        CleanupStack::Pop( op ); 
+        CleanupStack::Pop( singleOpWatcher );
+        CleanupStack::PopAndDestroy( 2 ); // CAknInputBlock, release mtmUi
+        }
+    }
+
+// ----------------------------------------------------
+// CMceSettingsSessionObserver::MtmAccountsL
+// ----------------------------------------------------
+EXPORT_C CUidNameArray* CMceSettingsSessionObserver::MtmAccountsL( TUid aType )
+    {
+    CUidNameArray* accounts = new (ELeave) CUidNameArray(
+        KMceArrayGranularity );
+    CleanupStack::PushL( accounts );
+
+    CMsvEntrySelection* sel = NULL;
+
+    if ( aType == KSenduiMtmSmtpUid )
+        {
+        sel = MsvUiServiceUtilities::GetListOfAccountsL(
+            *iSession,
+            ETrue );
+        }
+    else
+        {
+        sel = MsvUiServiceUtilities::GetListOfAccountsWithMTML(
+            *iSession,
+            aType,
+            ETrue );
+        }
+    CleanupStack::PushL( sel );
+
+    CMsvEntry* rootEntry=CMsvEntry::NewL(
+        *iSession,
+        KMsvRootIndexEntryId,
+        TMsvSelectionOrdering(KMsvNoGrouping, EMsvSortByNone, ETrue ) );
+    delete iRootEntry;
+    iRootEntry = rootEntry;
+
+    TUid uid;
+    TUid techType=iUiRegistry->TechnologyTypeUid( aType );
+    const TInt numAccounts=sel->Count();
+    for (TInt cc=0; cc<numAccounts; cc++)
+        {
+        uid.iUid=sel->At(cc);
+        TMsvEntry tentry;
+        TRAPD( err, ( tentry = iRootEntry->ChildDataL( uid.iUid ) ) );
+        if ( err == KErrNone &&
+            iUiRegistry->IsPresent( tentry.iMtm ) && 
+            iUiRegistry->TechnologyTypeUid( tentry.iMtm ) == techType )
+            {
+            const TInt count = accounts->Count();
+            TBool foundService = EFalse;
+            //check that related service is not already added to array
+            for ( TInt loop = 0; loop < count; loop ++ )
+                {
+                if ( tentry.iRelatedId == ( *accounts )[loop].iUid.iUid )
+                    {
+                    foundService = ETrue;
+                    break;
+                    }
+                }
+            if ( !foundService )
+                {
+                TUidNameInfo info( uid, tentry.iDetails.Left( KMceVisibleTextLength ) );
+                accounts->AppendL( info );
+                }
+            }
+        }
+    CleanupStack::PopAndDestroy( sel );
+    CleanupStack::Pop( accounts );
+    return accounts;
+    }
+
+// ----------------------------------------------------
+// CMceSettingsSessionObserver::IsPresent
+// ----------------------------------------------------
+EXPORT_C TBool CMceSettingsSessionObserver::IsPresent( TUid aMtm ) const
+    {
+    return iUiRegistry->IsPresent( aMtm );
+    }
+
+// ----------------------------------------------------
+// CMceSettingsSessionObserver::LeaveIfDiskSpaceUnderCriticalLevelL
+// ----------------------------------------------------
+void CMceSettingsSessionObserver::LeaveIfDiskSpaceUnderCriticalLevelL( TInt aBytesToWrite ) const
+    {
+    if ( MsvUiServiceUtilities::DiskSpaceBelowCriticalLevelL( *iSession, aBytesToWrite) )
+        {
+        User::Leave( KErrDiskFull );
+        }
+    }
+
+// ----------------------------------------------------
+// CMceSettingsSessionObserver::CancelFreeDiskSpaceRequest
+// Static function.
+// ----------------------------------------------------
+void CMceSettingsSessionObserver::CancelFreeDiskSpaceRequest(TAny* /*aAny*/)
+    {
+    // Cancel free disk space request to be implemented
+    }
+
+// ----------------------------------------------------
+// CMceSettingsSessionObserver::MtmName
+//
+// ----------------------------------------------------
+EXPORT_C THumanReadableName CMceSettingsSessionObserver::MtmName( TUid aMtm ) const
+    {
+    return iUiRegistry->RegisteredMtmDllInfo( aMtm ).HumanReadableName();
+    }
+    
+// ----------------------------------------------------
+// CMceSettingsSessionObserver::SetChangeMessageStore
+//
+// ----------------------------------------------------
+EXPORT_C void CMceSettingsSessionObserver::SetChangeMessageStore( TBool /*aChangeEnded*/ )
+    {
+    // do nothing...
+    }