idlefw/plugins/shortcutplugin/src/caiscutsettingsapplist.cpp
changeset 0 79c6a41cd166
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlefw/plugins/shortcutplugin/src/caiscutsettingsapplist.cpp	Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,1087 @@
+/*
+* Copyright (c) 2005-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:  Application list for settings listbox
+*
+*/
+
+
+#include <msvuids.h>        // For KMsvRootIndexEntryIdValue
+#include <SenduiMtmUids.h>
+#include <StringLoader.h>
+
+#include <aiscutsettingsres.rsg>
+#include <aiscuttexts.rsg>
+
+#include <featmgr.h>
+#include <centralrepository.h>
+#include <settingsinternalcrkeys.h>
+#include <javaregistry.h>
+#include <javaregistryentry.h>
+#include <pathinfo.h>
+
+#include "caiscutsettingsapplist.h"
+#include "taiscutparser.h"
+#include "caiscutsettingsitem.h"
+#include "aiscutdefs.h"
+#include <activeidle2domaincrkeys.h>
+
+#include "debug.h"
+
+using namespace Java;
+
+
+const TInt KDriveAndColon = 2; //drive char and colon string length, e.g. "c:"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CAiScutSettingsAppList::CAiScutSettingsAppList(CCoeEnv* aEnv, MAiScutListObserver& aObserver)
+    : CActive(CActive::EPriorityLow)    // Background task priority.
+                                        // Higher priority would block the wait dialog.
+    , iEnv(aEnv)
+    , iObserver(aObserver)
+    {
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsAppList::ConstructL()
+    {
+    User::LeaveIfError(iApaSession.Connect());
+    iMsvSession = CMsvSession::OpenAsObserverL(*this);
+
+    CActiveScheduler::Add(this);
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CAiScutSettingsAppList* CAiScutSettingsAppList::NewL(CCoeEnv* aEnv,
+    MAiScutListObserver& aObserver)
+    {
+    CAiScutSettingsAppList* self = new (ELeave) CAiScutSettingsAppList(aEnv, aObserver);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CAiScutSettingsAppList::~CAiScutSettingsAppList()
+    {
+    if (IsActive())
+        {
+        Cancel();
+        }
+
+    delete iAppNotifier;
+    delete iMsvSession;
+    iApaSession.Close();
+    iListItems.ResetAndDestroy();
+    iMailboxes.Close(); // Do not call ResetAndDestroy() to this.
+    }
+
+// ---------------------------------------------------------------------------
+// From MDesCArray
+// Returns the number of descriptor elements in a descriptor array.
+// ---------------------------------------------------------------------------
+//
+TInt CAiScutSettingsAppList::MdcaCount() const
+    {
+    return iListItems.Count();
+    }
+
+// ---------------------------------------------------------------------------
+// From MDesCArray
+// Indexes into a descriptor array.
+// ---------------------------------------------------------------------------
+//
+TPtrC CAiScutSettingsAppList::MdcaPoint(TInt aIndex) const
+    {
+    if (aIndex < 0 || aIndex >= iListItems.Count())
+        {
+        TPtrC ret(KNullDesC);
+        return ret;
+        }
+    return iListItems[aIndex]->Caption();
+    }
+
+// ---------------------------------------------------------------------------
+// From class MMsvSessionObserver.
+// Handles an event from the message server.
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsAppList::HandleSessionEventL(
+    TMsvSessionEvent aEvent, TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/)
+    {
+    TBool updated = ETrue;
+    TBool added   = EFalse;
+
+    switch (aEvent)
+        {
+    case EMsvEntriesCreated:
+    case EMsvEntriesDeleted:
+    case EMsvEntriesChanged:
+        if (iObserving)
+            {
+            CMsvEntry* rootEntry = GetRootEntryL();
+            
+            CleanupStack::PushL(rootEntry);
+            TBuf<255> mailboxId;
+            
+            // Reset iMailboxes
+            for (TInt j = iMailboxes.Count() - 1; j >= 0; --j)
+            {            
+              RemoveMailboxL(iMailboxes[j]->Params());
+            }
+
+      // Add all mailboxes
+      for (TInt i = rootEntry->Count() - 1; i >= 0; --i)
+                {
+                    const TMsvEntry& tentry = (*rootEntry)[i];
+
+              if (tentry.iMtm == KSenduiMtmImap4Uid || tentry.iMtm == KSenduiMtmPop3Uid)
+                {   
+                  mailboxId.Num(tentry.Id());       
+                        AddMailboxL(tentry.iDetails, mailboxId);
+                    }                      
+              }      
+              
+            CleanupStack::PopAndDestroy(rootEntry);
+            }
+
+        if (updated)
+            {
+            iObserver.HandleScutListEventL(MAiScutListObserver::EAppListUpdated, added);
+            }
+        break;
+
+    default:
+        break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From class MApaAppListServObserver.
+// Handles a change in the application list.
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsAppList::HandleAppListEvent(TInt /*aEvent*/)
+    {
+    TRAP_IGNORE(UpdateAppListL());
+    }
+
+// ---------------------------------------------------------------------------
+// Starts the asynchronous application list initialization.
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsAppList::StartL()
+    {
+    iListItems.ResetAndDestroy();
+
+    AddStaticItemsL();
+    AddMailboxesL();
+    AddExtraItemsFromCRL();
+
+    if (iApaSession.GetAllApps() == KErrNone &&
+        iApaSession.AppCount(iTotalAppCount) == KErrNone)
+        {
+        CompleteSelf();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Checks if the application list is ready to be shown.
+// ---------------------------------------------------------------------------
+//
+TBool CAiScutSettingsAppList::IsReady() const
+    {
+    return iReady;
+    }
+
+// ---------------------------------------------------------------------------
+// Tells the application list to start or stop observing for changes.
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsAppList::SetObservingL(TBool aObserving)
+    {
+    delete iAppNotifier;
+    iAppNotifier = NULL;
+
+    if (aObserving)
+        {
+        UpdateAppListL();
+
+        iAppNotifier = CApaAppListNotifier::NewL(this, CActive::EPriorityStandard);
+        }
+
+    iObserving = aObserving;
+    }
+
+// ---------------------------------------------------------------------------
+// Finds the index of the given settings item in the application list.
+// ---------------------------------------------------------------------------
+//
+TInt CAiScutSettingsAppList::FindIndex(CAiScutSettingsItem& aItem)
+    {
+    TInt index = KErrNotFound;
+
+    TAiScutParser parser;
+    parser.Parse(aItem.Value());
+    TPtrC params(parser.Get(EScutDefParamNameAndValue));
+
+    TUid uid = aItem.Uid();
+    for (TInt i = iListItems.Count() - 1; i >= 0; --i)
+        {
+        CAppListItem* item = iListItems[i];
+        if ( (item->Uid() == uid) && params.Compare(item->Params()) == 0)
+        {
+            index = i;
+            break;
+        }
+        // Url => compare the whole url not just the parameters
+        else if( item->Type() == EAiScutSettingTypeUrl )
+            {
+            if ( parser.Get(EScutDefComplete).Compare(item->Params()) == 0 )
+                {
+                index = i;
+                break;
+                }
+            }
+        }
+
+    return index;
+    }
+
+// ---------------------------------------------------------------------------
+// Returns target application data from the given index.
+// ---------------------------------------------------------------------------
+//
+TInt CAiScutSettingsAppList::GetDataByIndex(TInt aIndex, TUid& aUid,
+    TPtrC& aParams, TPtrC& aCaption, TAiScutSettingType& aType ) const
+    {
+    if (aIndex >= 0 && aIndex < iListItems.Count())
+        {
+        CAppListItem* item = iListItems[aIndex];
+        aUid = item->Uid();
+        aType = item->Type();
+        aParams.Set(item->Params());
+        aCaption.Set(item->Caption());
+        return KErrNone;
+        }
+
+    return KErrNotFound;
+    }
+
+// ---------------------------------------------------------------------------
+// From CActive
+// Implements cancellation of an outstanding request.
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsAppList::DoCancel()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// From CActive
+// Performs one step of the app list initialization.
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsAppList::RunL()
+    {
+    TApaAppInfo appInfo;
+    TInt err = GetNextValidApp(appInfo);
+
+    switch (err)
+        {
+    case KErrNone:
+        AddApplicationL(appInfo);
+        CompleteSelf();
+        break;
+
+    case RApaLsSession::ENoMoreAppsInList:
+        iReady = ETrue;
+        iObserver.HandleScutListEventL(MAiScutListObserver::EAppListReady, EFalse);
+        break;
+
+    //Indicates that an RApaLsSession member function was called before the session's 
+    //  application list is fully populated. 
+    case RApaLsSession::EAppListInvalid:
+        StartL(); // Just try again.
+        break;
+
+    default:
+        User::LeaveIfError(err);
+        break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From CActive
+// Handles an error situation.
+// ---------------------------------------------------------------------------
+//
+TInt CAiScutSettingsAppList::RunError(TInt aError)
+    {
+    return aError;
+    }
+
+// ---------------------------------------------------------------------------
+// Completes own request status to make sure active scheduler calls RunL again.
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsAppList::CompleteSelf()
+    {
+    if (!IsActive())
+        {
+        TRequestStatus* status = &iStatus;
+        User::RequestComplete(status, KErrNone);
+        SetActive();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Adds an application to the list.
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsAppList::AddApplicationL(TApaAppInfo& aAppInfo)
+    {
+    TBool allowed = ETrue;
+
+    // EasyVoIP is only added when VoIP is supported
+    if (aAppInfo.iUid == KScutEasyVoIPApplicationUid)
+        {
+        // Check VoIP variation status
+        TInt voipStatus = 0;
+        // For checking VoIP variation status
+        CRepository* repository = CRepository::NewL(KCRUidTelephonySettings);
+        repository->Get(KDynamicVoIP, voipStatus);
+        delete repository;
+        allowed = (voipStatus && FeatureManager::FeatureSupported(KFeatureIdCommonVoip));
+
+        __PRINTS( "XAI: CAiScutSettingsAppList::AddApplicationL");
+        __PRINT( __DBG_FORMAT( "XAI:   voipStatus = %d, allowed = %d"), voipStatus, allowed);
+        }
+
+    // VoIP launcher is always invisible in shortcuts.
+    if (aAppInfo.iUid == KScutVoIPLauncherUid)
+        {
+        allowed = EFalse;
+        }
+
+    if (iObserver.IsHidden(aAppInfo.iUid))
+        {
+        allowed = EFalse;
+        }
+
+    if (allowed)
+        {
+        CAppListItem* listItem = CAppListItem::NewLC(aAppInfo.iUid, aAppInfo.iCaption);
+        listItem->SetType( EAiScutSettingTypeApplication );
+        TLinearOrder<CAppListItem> sortMethod(CAppListItem::CompareCaption);
+        User::LeaveIfError(iListItems.InsertInOrderAllowRepeats(listItem, sortMethod));
+        CleanupStack::Pop(listItem);
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Adds the static list items to the application list.
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsAppList::AddStaticItemsL()
+    {
+    HBufC* caption = NULL;
+    CAppListItem* listItem = NULL;
+    TLinearOrder<CAppListItem> sortMethod(CAppListItem::CompareCaption);
+
+    // Connectivity Status item
+    caption = StringLoader::LoadLC(R_SCUT_SETTINGS_CONNECTIVITY_STATUS, iEnv);
+    listItem = CAppListItem::NewLC(KScutGeneralSettingsUid, *caption);
+    listItem->SetParamsL(KScutParamConnectivityView);
+    listItem->SetType( EAiScutSettingTypeApplication );
+    User::LeaveIfError(iListItems.InsertInOrderAllowRepeats(listItem, sortMethod));
+    CleanupStack::Pop(listItem);
+    CleanupStack::PopAndDestroy(caption);
+    caption = NULL;
+    listItem = NULL;
+
+    // New Message item.
+    caption = StringLoader::LoadLC(R_SCUT_SETTINGS_NEW_MSG, iEnv);
+    listItem = CAppListItem::NewLC(KScutMessagingUid, *caption);
+    listItem->SetParamsL(KScutParamNewMsg);
+    listItem->SetType( EAiScutSettingTypeApplication );
+    User::LeaveIfError(iListItems.InsertInOrderAllowRepeats(listItem, sortMethod));
+    CleanupStack::Pop(listItem);
+    CleanupStack::PopAndDestroy(caption);
+    caption = NULL;
+    listItem = NULL;
+
+    // New Email item.
+    caption = StringLoader::LoadLC(R_SCUT_SETTINGS_NEW_EMAIL, iEnv);
+    listItem = CAppListItem::NewLC(KScutMessagingUid, *caption);
+    listItem->SetParamsL(KScutParamNewEmail);
+    listItem->SetType( EAiScutSettingTypeApplication );
+    User::LeaveIfError(iListItems.InsertInOrderAllowRepeats(listItem, sortMethod));
+    CleanupStack::Pop(listItem);
+    CleanupStack::PopAndDestroy(caption);
+    caption = NULL;
+    listItem = NULL;
+
+#ifdef __SYNCML_DS_EMAIL
+    // New SyncML mail item.
+    caption = StringLoader::LoadLC(R_SCUT_SETTINGS_NEW_SYNCML_MAIL, iEnv);
+    listItem = CAppListItem::NewLC(KScutMessagingUid, *caption);
+    listItem->SetParamsL(KScutParamNewSyncMLMail);
+    listItem->SetType( EAiScutSettingTypeApplication );
+    User::LeaveIfError(iListItems.InsertInOrderAllowRepeats(listItem, sortMethod));
+    CleanupStack::Pop(listItem);
+    CleanupStack::PopAndDestroy(caption);
+    caption = NULL;
+    listItem = NULL;
+#endif
+
+    if (FeatureManager::FeatureSupported(KFeatureIdMmsPostcard)
+        && IsInRom( KScutPostcardEditorUid ) )
+        {
+        // New Postcard item.
+        caption = StringLoader::LoadLC(R_SCUT_SETTINGS_NEW_POSTCARD, iEnv);
+        listItem = CAppListItem::NewLC(KScutMessagingUid, *caption);
+        listItem->SetParamsL(KScutParamNewPostcard);
+        listItem->SetType( EAiScutSettingTypeApplication );
+        User::LeaveIfError(iListItems.InsertInOrderAllowRepeats(listItem, sortMethod));
+        CleanupStack::Pop(listItem);
+        CleanupStack::PopAndDestroy(caption);
+        caption = NULL;
+        listItem = NULL;
+        }
+
+    if (FeatureManager::FeatureSupported(KFeatureIdAudioMessaging))
+        {
+        // New Audio Message item.
+        caption = StringLoader::LoadLC(R_SCUT_SETTINGS_NEW_AUDIO_MSG, iEnv);
+        listItem = CAppListItem::NewLC(KScutMessagingUid, *caption);
+        listItem->SetParamsL(KScutParamNewAudioMsg);
+        listItem->SetType( EAiScutSettingTypeApplication );
+        User::LeaveIfError(iListItems.InsertInOrderAllowRepeats(listItem, sortMethod));
+        CleanupStack::Pop(listItem);
+        CleanupStack::PopAndDestroy(caption);
+        caption = NULL;
+        listItem = NULL;
+        }
+
+    // Select Message type item.
+    caption = StringLoader::LoadLC(R_SCUT_SETTINGS_SELECT_MSG_TYPE, iEnv);
+    listItem = CAppListItem::NewLC(KScutMessagingUid, *caption);
+    listItem->SetParamsL(KScutParamSelectMsgType);
+    listItem->SetType( EAiScutSettingTypeApplication );
+    User::LeaveIfError(iListItems.InsertInOrderAllowRepeats(listItem, sortMethod));
+    CleanupStack::Pop(listItem);
+    CleanupStack::PopAndDestroy(caption);
+    caption = NULL;
+    listItem = NULL;
+    // Installation view.
+    caption = StringLoader::LoadLC(R_SCUT_SETTINGS_APPMNGR, iEnv); 
+    listItem = CAppListItem::NewLC(KScutGeneralSettingsUid, *caption);
+    listItem->SetParamsL(KScutParamInstallationsView);
+    listItem->SetType( EAiScutSettingTypeApplication );
+    User::LeaveIfError(iListItems.InsertInOrderAllowRepeats(listItem, sortMethod));
+    CleanupStack::Pop(listItem);
+    CleanupStack::PopAndDestroy(caption);
+    caption = NULL;
+    listItem = NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// Adds extra list items to the application list.
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsAppList::AddExtraItemsL()
+    {
+    // No Effect item.
+    HBufC* caption = StringLoader::LoadLC(R_SCUT_SETTINGS_NO_EFFECT, iEnv);
+    CAppListItem* listItem = CAppListItem::NewLC(KScutSettingsDllUid, *caption);
+    listItem->SetParamsL(KScutParamNoEffect);
+    listItem->SetType( EAiScutSettingTypeApplication );
+    User::LeaveIfError(iListItems.Insert(listItem, 0)); // insert as first item.
+    CleanupStack::Pop(listItem);
+    CleanupStack::PopAndDestroy(caption);
+    }
+
+void CAiScutSettingsAppList::AddExtraItemsFromCRL()
+    {
+    CRepository *cr = CRepository::NewL( TUid::Uid( KCRUidActiveIdleLV ) );        
+    User::LeaveIfNull( cr );
+    
+    CleanupStack::PushL( cr );
+    
+    TUint32 crKey = KAIExtraShortcutsKeyRangeStart;
+    TBool moreSettings = ETrue;
+    TInt err = KErrNone;
+    TAiScutParser parser;
+    
+    HBufC* settingValue = HBufC::NewLC(NCentralRepositoryConstants::KMaxUnicodeStringLength);
+    TPtr settingValuePtr = settingValue->Des();
+    
+    while( moreSettings )
+        {
+        err = cr->Get( crKey++, settingValuePtr ); 
+        if ( err == KErrNone && settingValue->Length() > 0 )
+            {
+            CAppListItem* listItem = NULL;
+            parser.Parse( *settingValue );
+            
+            // First try to find the custom title
+            HBufC* caption = HBufC::NewLC( settingValue->Length() );
+            TPtr captionPtr = caption->Des();
+            TInt err = parser.CustomTitle( captionPtr );    
+            TUid appUid = parser.Uid();
+                
+            if ( err != KErrNone || caption->Length() <= 0 )
+                {
+                CleanupStack::PopAndDestroy( caption );
+                caption = NULL;
+                }
+            
+            if ( !caption )
+                {
+                // Web address...
+                 if ( parser.Type() == EScutWebAddress || parser.Type() == EScutUnknown )
+                     {
+                     TUriParser parser;
+                     TInt err = parser.Parse(*settingValue);
+
+                     if (err == KErrNone)
+                         {
+                         // Remove scheme from the url.
+                         caption = parser.Extract(EUriHost).AllocLC();
+                         }
+                     else
+                         {
+                         caption = settingValue->AllocLC();
+                         }
+                     }
+                 //  ...application. Nothing else supported at the moment
+                 else
+                     {
+                     TApaAppInfo appInfo;
+                     err = iApaSession.GetAppInfo(appInfo, appUid);
+                     if (err == KErrNone)
+                         {
+                         caption = appInfo.iCaption.AllocLC();
+                         }
+                     }
+                }
+            if ( caption )
+                {
+                listItem = CAppListItem::NewLC( KNullUid , *caption  );
+                listItem->SetParamsL( *settingValue );
+                listItem->SetType( EAiScutSettingTypeUrl );
+                TLinearOrder<CAppListItem> sortMethod(CAppListItem::CompareCaption);
+                User::LeaveIfError(iListItems.InsertInOrderAllowRepeats(listItem, sortMethod));
+                CleanupStack::Pop( listItem );
+                CleanupStack::PopAndDestroy( caption );
+                }
+            }
+        else
+            {
+            moreSettings = EFalse;
+            }
+        }
+    
+
+    
+    CleanupStack::PopAndDestroy( settingValue );
+    CleanupStack::PopAndDestroy( cr );
+    }
+// ---------------------------------------------------------------------------
+// Removes extra list items from the application list.
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsAppList::RemoveExtraItemsL()
+    {
+    // No Effect item.
+    CAppListItem* listItem = iListItems[0];
+    iListItems.Remove(0);
+    if (listItem)
+        {
+        delete listItem;
+        listItem = NULL;      
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Returns the root entry containing mailboxes.
+// ---------------------------------------------------------------------------
+//
+CMsvEntry* CAiScutSettingsAppList::GetRootEntryL()
+    {
+    return iMsvSession->GetEntryL(KMsvRootIndexEntryIdValue);
+    }
+
+// ---------------------------------------------------------------------------
+// Adds remote mailboxes to the application list.
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsAppList::AddMailboxesL()
+    {
+    CMsvEntry* rootEntry = GetRootEntryL();
+
+    CleanupStack::PushL(rootEntry);
+    TBuf<255> mailboxId;
+
+    for (TInt i = rootEntry->Count() - 1; i >= 0; --i)
+        {
+        const TMsvEntry& tentry = (*rootEntry)[i];
+
+        if (tentry.iMtm == KSenduiMtmImap4Uid || tentry.iMtm == KSenduiMtmPop3Uid)
+            {
+            mailboxId.Num(tentry.Id());
+            AddMailboxL(tentry.iDetails, mailboxId);
+            }
+        }
+
+    CleanupStack::PopAndDestroy(rootEntry);
+    }
+
+// ---------------------------------------------------------------------------
+// Adds a mailbox to the list.
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsAppList::AddMailboxL(const TDesC& aMailbox, const TDesC& aMailboxId)
+{
+    CAppListItem* listItem = CAppListItem::NewLC(KScutMessagingUid, aMailbox);
+
+  // Insert params containing mailbox id
+    HBufC* params = HBufC::NewLC(KScutParamMailbox().Length() + aMailboxId.Length());
+    params->Des().Copy(KScutParamMailbox);
+    params->Des().Append(aMailboxId);
+    listItem->SetParamsL(*params);
+    listItem->SetType( EAiScutSettingTypeApplication );
+    CleanupStack::PopAndDestroy(params);
+
+    TLinearOrder<CAppListItem> sortMethod(CAppListItem::CompareCaption);
+    User::LeaveIfError(iListItems.InsertInOrderAllowRepeats(listItem, sortMethod));
+    CleanupStack::Pop(listItem);
+    User::LeaveIfError(iMailboxes.Append(listItem));
+    listItem = NULL;
+}
+
+// ---------------------------------------------------------------------------
+// Removes a mailbox from the list.
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsAppList::RemoveMailboxL(const TDesC& aMailboxParam)
+    {
+    for (TInt i = iListItems.Count() - 1; i >= 0; --i)
+        {
+        CAppListItem* listItem = iListItems[i];
+        if (aMailboxParam.Compare(listItem->Params()) == 0)
+            {
+            // Also remove the mailbox from the mailbox array
+            for (TInt j = iMailboxes.Count() - 1; j >= 0; --j)
+                {
+                if (aMailboxParam.Compare(iMailboxes[j]->Params()) == 0)
+                    {
+                    iMailboxes.Remove(j);
+                    }
+                }
+
+            iListItems.Remove(i);
+            delete listItem;
+            listItem = NULL;
+
+            break;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Gets the next valid application from application architecture server.
+// ---------------------------------------------------------------------------
+//
+TInt CAiScutSettingsAppList::GetNextValidApp(TApaAppInfo& aAppInfo)
+    {
+    TInt err = KErrNone;
+    TBool validAppFound = EFalse;
+
+    while (!validAppFound)
+        {
+        TApaAppInfo appInfo;
+        err = iApaSession.GetNextApp(appInfo);
+        if (err == KErrNone)
+            {
+            TApaAppCapabilityBuf capBuf;
+            TApaAppCapability cap;
+
+            if ((iApaSession.GetAppCapability(capBuf, appInfo.iUid) == KErrNone))
+                {
+                cap = capBuf();
+
+                TInt screenNumber(0);
+                err = iApaSession.GetDefaultScreenNumber( screenNumber, appInfo.iUid );
+
+                if ((err == KErrNone) && (cap.iAppIsHidden == EFalse) && (screenNumber == 0)) 
+                    {
+                    aAppInfo = appInfo;
+                    validAppFound = ETrue;
+                    }
+                }
+            }
+        else
+            {
+            return err;
+            }
+        }
+
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
+// Updates the application list.
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsAppList::UpdateAppListL()
+    {
+    TBool updated = EFalse;
+    TBool added   = EFalse;
+
+    TInt totalAppCount = 0;
+
+    if (iApaSession.AppCount(totalAppCount) == KErrNone)
+        {
+        if (totalAppCount < iTotalAppCount)
+            {
+            RemoveUninstalledAppFromListL(iTotalAppCount - totalAppCount);
+            updated = ETrue;
+            added = EFalse;
+            }
+        else if (totalAppCount > iTotalAppCount)
+            {
+            AddInstalledAppToListL(totalAppCount - iTotalAppCount);
+            updated = ETrue;
+            added = ETrue;
+            }
+
+        iTotalAppCount = totalAppCount;
+        }
+
+    if (updated)
+        {
+        iObserver.HandleScutListEventL(MAiScutListObserver::EAppListUpdated, added);
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Figures out which application is missing from the list and adds it.
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsAppList::AddInstalledAppToListL(TInt aCount)
+    {
+    TInt added = 0;
+    TApaAppInfo appInfo;
+    TInt err = GetNextValidApp(appInfo);
+
+    while (err == KErrNone)
+        {
+        TBool found = EFalse;
+
+        for (TInt i = iListItems.Count() - 1; i >= 0; --i)
+            {
+            if (iListItems[i]->Uid() == appInfo.iUid)
+                {
+                found = ETrue;
+                break;
+                }
+            }
+
+        if (!found)
+            {
+            AddApplicationL(appInfo);
+            if (++added == aCount)
+                {
+                // Found all of them, no need to go further
+                return ;
+                }
+            }
+
+        err = GetNextValidApp(appInfo);
+        }
+
+    // create registry 
+    CJavaRegistry* registry = CJavaRegistry::NewLC();
+
+    // get all uids stored in registry
+    RArray<TUid> uids;
+    registry->GetRegistryEntryUidsL( uids );
+
+    CleanupClosePushL(uids);
+
+    for (TInt javaIndex = 0; javaIndex < uids.Count(); ++javaIndex)
+        {
+        TInt found = EFalse;
+        for (TInt listIndex = 0; listIndex < iListItems.Count(); ++listIndex )
+            {
+            if (iListItems[listIndex]->Uid() == uids[javaIndex])
+                {
+                found = ETrue;
+                }
+            }
+        if (!found)
+            {
+            // get registry entry by uid (i.e. the first entry)
+            CJavaRegistryEntry* entry =
+                registry->RegistryEntryL( uids[javaIndex] );
+            if( entry )
+                {
+                CleanupStack::PushL(entry);
+
+                // get entry properties (i.e. name)
+                const TDesC& name = entry->Name();
+                TUid uid = entry->Uid();
+
+                    CAppListItem* listItem = CAppListItem::NewLC(uid, name);
+                  listItem->SetType( EAiScutSettingTypeApplication );
+                TLinearOrder<CAppListItem> sortMethod(CAppListItem::CompareCaption);
+                if (entry->Type() >= EGeneralApplication)
+                    {
+                    User::LeaveIfError(iListItems.InsertInOrderAllowRepeats(listItem, sortMethod));
+                    ++added;
+                    }
+                else
+                    {
+                    delete listItem;
+                    }
+                CleanupStack::Pop(listItem);
+
+                CleanupStack::PopAndDestroy(entry);
+                }
+            if (added == aCount)
+                {
+                break;
+                }
+            }
+        }
+    CleanupStack::PopAndDestroy(); // uids
+    CleanupStack::PopAndDestroy(registry);
+    }
+
+// ---------------------------------------------------------------------------
+// Figures out which application should not be in the list and removes it.
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsAppList::RemoveUninstalledAppFromListL(TInt aCount)
+    {
+    TInt removed = 0;
+
+    for (TInt i = iListItems.Count() - 1; i >= 0; --i)
+        {
+        CAppListItem* listItem = iListItems[i];
+        TApaAppInfo ignored;
+        if (iApaSession.GetAppInfo(ignored, listItem->Uid()) == KErrNotFound)
+            {
+            iListItems.Remove(i);
+            delete listItem;
+            listItem = NULL;
+
+            if (++removed == aCount)
+                {
+                return ;
+                }
+            }
+        }
+    // create registry 
+    CJavaRegistry* registry = CJavaRegistry::NewLC();
+    // get all uids stored in registry
+    RArray<TUid> uids;
+    registry->GetRegistryEntryUidsL( uids );
+
+    CleanupClosePushL(uids);
+
+    for (TInt listIndex = iListItems.Count(); listIndex >= 0 ; --listIndex )
+        {
+        TInt found = EFalse;
+        for (TInt javaIndex = 0; javaIndex < uids.Count(); ++javaIndex)
+            {
+            if (iListItems[listIndex]->Uid() == uids[javaIndex])
+                {
+                found = ETrue;
+                }
+            }
+        if (!found)
+            {
+            // Item removed, remove from item list
+            CAppListItem* listItem = iListItems[listIndex];
+            iListItems.Remove(listIndex);
+            delete listItem;
+            if (++removed == aCount)
+                {
+                break;
+                }
+            }
+        }
+    CleanupStack::PopAndDestroy(); // uids
+    CleanupStack::PopAndDestroy(registry);
+    }
+
+TBool CAiScutSettingsAppList::IsNonNative(const TUid& aUid)
+    {
+    TBool ret = EFalse;
+
+    const TUid KMidletAppType = { 0x10210E26 };
+    TUid typeuid = KNullUid;
+
+    if (KErrNone == iApaSession.GetAppType(typeuid, aUid))
+        {
+        if (typeuid == KMidletAppType)
+            {
+            ret = ETrue;
+            }
+        }
+
+    return ret;
+    }
+
+
+TBool CAiScutSettingsAppList::IsInRom( const TUid& aUid )
+    {
+    TBool inROM = EFalse;
+
+    TApaAppInfo appInfo;    
+    if( iApaSession.GetAppInfo( appInfo, aUid ) == KErrNone )
+        {
+        // Does the full path start with z: 
+        if( appInfo.iFullName.FindC( 
+                PathInfo::RomRootPath().Left( KDriveAndColon ) ) >= 0 )            
+            {          
+            inROM = ETrue;                     
+            }
+        }
+    return inROM;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Nested class to store individual application list items
+// ---------------------------------------------------------------------------
+//
+CAiScutSettingsAppList::CAppListItem::CAppListItem(TUid aUid) : iUid(aUid)
+    {
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsAppList::CAppListItem::ConstructL(const TDesC& aCaption)
+    {
+    iCaption = aCaption.AllocL();
+    // Defaults to application
+    iType = EAiScutSettingTypeApplication;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CAiScutSettingsAppList::CAppListItem* CAiScutSettingsAppList::CAppListItem::NewLC(
+    TUid aUid, const TDesC& aCaption)
+    {
+    CAppListItem* self = new (ELeave) CAppListItem(aUid);
+    CleanupStack::PushL(self);
+    self->ConstructL(aCaption);
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CAiScutSettingsAppList::CAppListItem::~CAppListItem()
+    {
+    delete iCaption;
+    delete iParams;
+    }
+
+// ---------------------------------------------------------------------------
+// Compare method used to add the items to the list in sorted order.
+// ---------------------------------------------------------------------------
+//
+TInt CAiScutSettingsAppList::CAppListItem::CompareCaption(const CAppListItem& aFirst,
+    const CAppListItem& aSecond)
+    {
+    return aFirst.iCaption->Des().CompareC(*aSecond.iCaption);
+    }
+
+// ---------------------------------------------------------------------------
+// Returns the item target application uid.
+// ---------------------------------------------------------------------------
+//
+TUid CAiScutSettingsAppList::CAppListItem::Uid() const
+    {
+    return iUid;
+    }
+
+// ---------------------------------------------------------------------------
+// Returns the item target application caption.
+// ---------------------------------------------------------------------------
+//
+TPtrC CAiScutSettingsAppList::CAppListItem::Caption() const
+    {
+    return TPtrC(*iCaption);
+    }
+
+// ---------------------------------------------------------------------------
+// Returns the possible parameters for item target.
+// ---------------------------------------------------------------------------
+//
+TPtrC CAiScutSettingsAppList::CAppListItem::Params() const
+    {
+    TPtrC params;
+    if (iParams)
+        {
+        params.Set(*iParams);
+        }
+    return params;
+    }
+
+// ---------------------------------------------------------------------------
+// Sets the parameters for the item target.
+// ---------------------------------------------------------------------------
+//
+void CAiScutSettingsAppList::CAppListItem::SetParamsL(const TDesC& aParams)
+    {
+    HBufC* newParams = aParams.AllocL();
+    delete iParams;
+    iParams = newParams;
+    }
+
+TAiScutSettingType CAiScutSettingsAppList::CAppListItem::Type() const
+{
+    return iType;
+}
+
+void CAiScutSettingsAppList::CAppListItem::SetType( TAiScutSettingType aType )
+{
+    iType = aType;
+}
+// End of File.