contentstorage/casrv/caappscanner/src/casrvappscanner.cpp
author hgs
Fri, 11 Jun 2010 16:13:51 +0300
changeset 98 d2f833ab7940
parent 96 5d243a69bdda
child 99 7aaf39b772ac
permissions -rw-r--r--
201023
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
85
7feec50967db 201003_02
hgs
parents:
diff changeset
     1
/*
7feec50967db 201003_02
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
7feec50967db 201003_02
hgs
parents:
diff changeset
     3
* All rights reserved.
7feec50967db 201003_02
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
7feec50967db 201003_02
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
7feec50967db 201003_02
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
7feec50967db 201003_02
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
7feec50967db 201003_02
hgs
parents:
diff changeset
     8
*
7feec50967db 201003_02
hgs
parents:
diff changeset
     9
* Initial Contributors:
7feec50967db 201003_02
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
7feec50967db 201003_02
hgs
parents:
diff changeset
    11
*
7feec50967db 201003_02
hgs
parents:
diff changeset
    12
* Contributors:
7feec50967db 201003_02
hgs
parents:
diff changeset
    13
*
7feec50967db 201003_02
hgs
parents:
diff changeset
    14
* Description: casrvappscanner.cpp
7feec50967db 201003_02
hgs
parents:
diff changeset
    15
*
7feec50967db 201003_02
hgs
parents:
diff changeset
    16
*/
7feec50967db 201003_02
hgs
parents:
diff changeset
    17
7feec50967db 201003_02
hgs
parents:
diff changeset
    18
#include <e32property.h>
7feec50967db 201003_02
hgs
parents:
diff changeset
    19
#include <bautils.h>
7feec50967db 201003_02
hgs
parents:
diff changeset
    20
#include <swi/sisregistrysession.h>
7feec50967db 201003_02
hgs
parents:
diff changeset
    21
#include <swi/sisregistryentry.h>
7feec50967db 201003_02
hgs
parents:
diff changeset
    22
#include <swi/sisregistrypackage.h>
94
hgs
parents: 93
diff changeset
    23
#include <usif/scr/screntries.h>
85
7feec50967db 201003_02
hgs
parents:
diff changeset
    24
7feec50967db 201003_02
hgs
parents:
diff changeset
    25
#include "cadef.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    26
#include "casrvappscanner.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    27
#include "cautils.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    28
#include "casrvmmchistory.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    29
#include "pathinfo.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    30
#include "casrvengutils.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    31
#include "cainnerquery.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    32
#include "cainnerentry.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    33
#include "caarraycleanup.inl"
7feec50967db 201003_02
hgs
parents:
diff changeset
    34
#include "castorageproxy.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    35
94
hgs
parents: 93
diff changeset
    36
#include "caarraycleanup.inl"
92
hgs
parents: 89
diff changeset
    37
94
hgs
parents: 93
diff changeset
    38
using namespace Usif;
92
hgs
parents: 89
diff changeset
    39
85
7feec50967db 201003_02
hgs
parents:
diff changeset
    40
// ==================== LOCAL FUNCTIONS ====================
7feec50967db 201003_02
hgs
parents:
diff changeset
    41
7feec50967db 201003_02
hgs
parents:
diff changeset
    42
/**
7feec50967db 201003_02
hgs
parents:
diff changeset
    43
 * Identity function to search in an array of CCaInnerEntry.
7feec50967db 201003_02
hgs
parents:
diff changeset
    44
 * Identity is the ID.
7feec50967db 201003_02
hgs
parents:
diff changeset
    45
 * @param aLeft Search term.
7feec50967db 201003_02
hgs
parents:
diff changeset
    46
 * @param aRight Array item.
7feec50967db 201003_02
hgs
parents:
diff changeset
    47
 * @return ETrue if ID-s match.
7feec50967db 201003_02
hgs
parents:
diff changeset
    48
 */
7feec50967db 201003_02
hgs
parents:
diff changeset
    49
LOCAL_C TBool IdMatch( const CCaInnerEntry& aLeft,
7feec50967db 201003_02
hgs
parents:
diff changeset
    50
        const CCaInnerEntry& aRight )
7feec50967db 201003_02
hgs
parents:
diff changeset
    51
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
    52
    return aLeft.GetId() == aRight.GetId();
7feec50967db 201003_02
hgs
parents:
diff changeset
    53
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
    54
7feec50967db 201003_02
hgs
parents:
diff changeset
    55
/**
7feec50967db 201003_02
hgs
parents:
diff changeset
    56
 * Identity function to search in an array of CCaInnerEntry.
7feec50967db 201003_02
hgs
parents:
diff changeset
    57
 * Identity is the ID.
7feec50967db 201003_02
hgs
parents:
diff changeset
    58
 * @param aLeft Search term.
7feec50967db 201003_02
hgs
parents:
diff changeset
    59
 * @param aRight Array item.
7feec50967db 201003_02
hgs
parents:
diff changeset
    60
 * @return ETrue if ID-s match.
7feec50967db 201003_02
hgs
parents:
diff changeset
    61
 */
7feec50967db 201003_02
hgs
parents:
diff changeset
    62
LOCAL_C TBool UidMatch( const CCaInnerEntry& aLeft,
7feec50967db 201003_02
hgs
parents:
diff changeset
    63
        const CCaInnerEntry& aRight )
7feec50967db 201003_02
hgs
parents:
diff changeset
    64
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
    65
    return aLeft.GetUid() == aRight.GetUid();
7feec50967db 201003_02
hgs
parents:
diff changeset
    66
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
    67
7feec50967db 201003_02
hgs
parents:
diff changeset
    68
// ==================== MEMBER FUNCTIONS ====================
7feec50967db 201003_02
hgs
parents:
diff changeset
    69
7feec50967db 201003_02
hgs
parents:
diff changeset
    70
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
    71
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
    72
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    73
//
7feec50967db 201003_02
hgs
parents:
diff changeset
    74
CCaSrvAppScanner* CCaSrvAppScanner::NewL( CCaStorageProxy& aCaStorageProxy,
7feec50967db 201003_02
hgs
parents:
diff changeset
    75
        CCaSrvEngUtils& aUtils )
7feec50967db 201003_02
hgs
parents:
diff changeset
    76
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
    77
    CCaSrvAppScanner* scanner = new ( ELeave ) CCaSrvAppScanner(
7feec50967db 201003_02
hgs
parents:
diff changeset
    78
            aCaStorageProxy, aUtils );
7feec50967db 201003_02
hgs
parents:
diff changeset
    79
    CleanupStack::PushL( scanner );
7feec50967db 201003_02
hgs
parents:
diff changeset
    80
    scanner->ConstructL();
7feec50967db 201003_02
hgs
parents:
diff changeset
    81
    CleanupStack::Pop( scanner );
7feec50967db 201003_02
hgs
parents:
diff changeset
    82
    return scanner;
7feec50967db 201003_02
hgs
parents:
diff changeset
    83
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
    84
7feec50967db 201003_02
hgs
parents:
diff changeset
    85
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
    86
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
    87
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    88
//
7feec50967db 201003_02
hgs
parents:
diff changeset
    89
CCaSrvAppScanner::~CCaSrvAppScanner()
7feec50967db 201003_02
hgs
parents:
diff changeset
    90
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
    91
    Cancel();
94
hgs
parents: 93
diff changeset
    92
    iSoftwareRegistry.Close();
85
7feec50967db 201003_02
hgs
parents:
diff changeset
    93
    iApaLsSession.Close();
7feec50967db 201003_02
hgs
parents:
diff changeset
    94
    iInstalledPackages.Close();
7feec50967db 201003_02
hgs
parents:
diff changeset
    95
    delete iInstallNotifier;
7feec50967db 201003_02
hgs
parents:
diff changeset
    96
    delete iNotifier;
7feec50967db 201003_02
hgs
parents:
diff changeset
    97
    delete iMmcHistory;
7feec50967db 201003_02
hgs
parents:
diff changeset
    98
    iFs.Close();
7feec50967db 201003_02
hgs
parents:
diff changeset
    99
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   100
7feec50967db 201003_02
hgs
parents:
diff changeset
   101
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   102
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   103
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   104
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   105
CCaSrvAppScanner::CCaSrvAppScanner( CCaStorageProxy& aCaStorageProxy,
7feec50967db 201003_02
hgs
parents:
diff changeset
   106
        CCaSrvEngUtils& aUtils ) :
7feec50967db 201003_02
hgs
parents:
diff changeset
   107
    CActive( CActive::EPriorityStandard ),
7feec50967db 201003_02
hgs
parents:
diff changeset
   108
    iCaStorageProxy( aCaStorageProxy ), iSrvEngUtils( aUtils )
7feec50967db 201003_02
hgs
parents:
diff changeset
   109
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   110
    CActiveScheduler::Add( this );
7feec50967db 201003_02
hgs
parents:
diff changeset
   111
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   112
7feec50967db 201003_02
hgs
parents:
diff changeset
   113
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   114
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   115
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   116
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   117
void CCaSrvAppScanner::ConstructL()
7feec50967db 201003_02
hgs
parents:
diff changeset
   118
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   119
    User::LeaveIfError( iFs.Connect() );
7feec50967db 201003_02
hgs
parents:
diff changeset
   120
    TFileName path;
7feec50967db 201003_02
hgs
parents:
diff changeset
   121
    User::LeaveIfError( iFs.PrivatePath( path ) );
7feec50967db 201003_02
hgs
parents:
diff changeset
   122
    TUint attribute;
94
hgs
parents: 93
diff changeset
   123
    if( iFs.Att( path, attribute ) == KErrNotFound )
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   124
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   125
        TInt mdRes = iFs.MkDirAll( path );
7feec50967db 201003_02
hgs
parents:
diff changeset
   126
        if ( mdRes != KErrNone )
7feec50967db 201003_02
hgs
parents:
diff changeset
   127
            {
7feec50967db 201003_02
hgs
parents:
diff changeset
   128
            User::Leave( mdRes );
7feec50967db 201003_02
hgs
parents:
diff changeset
   129
            }
7feec50967db 201003_02
hgs
parents:
diff changeset
   130
        }
94
hgs
parents: 93
diff changeset
   131
    iMmcHistory = CCaSrvMmcHistory::NewL();
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   132
    iMmcHistory->LoadL( iFs, KCaMmcHistoryFname() );
7feec50967db 201003_02
hgs
parents:
diff changeset
   133
    iNotifier = CApaAppListNotifier::NewL(
7feec50967db 201003_02
hgs
parents:
diff changeset
   134
            this, CActive::EPriorityStandard );
7feec50967db 201003_02
hgs
parents:
diff changeset
   135
    iInstallNotifier = CCaInstallNotifier::NewL(
7feec50967db 201003_02
hgs
parents:
diff changeset
   136
            *this, CCaInstallNotifier::ESisInstallNotification );
7feec50967db 201003_02
hgs
parents:
diff changeset
   137
7feec50967db 201003_02
hgs
parents:
diff changeset
   138
    User::LeaveIfError( iApaLsSession.Connect() );
7feec50967db 201003_02
hgs
parents:
diff changeset
   139
    User::LeaveIfError( iApaLsSession.GetAllApps() ); // This is async.
94
hgs
parents: 93
diff changeset
   140
    User::LeaveIfError( iSoftwareRegistry.Connect() );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   141
    iApaLsSession.RegisterListPopulationCompleteObserver( iStatus );
7feec50967db 201003_02
hgs
parents:
diff changeset
   142
    iCollectionDownloadId = 0;
92
hgs
parents: 89
diff changeset
   143
    iAllCollectionId = 0;
98
hgs
parents: 96
diff changeset
   144
    
hgs
parents: 96
diff changeset
   145
    //TODO temporary sollution for fake uninstall progres notification
hgs
parents: 96
diff changeset
   146
    ClearUninstallFlagL();
hgs
parents: 96
diff changeset
   147
    
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   148
    SetActive();
7feec50967db 201003_02
hgs
parents:
diff changeset
   149
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   150
7feec50967db 201003_02
hgs
parents:
diff changeset
   151
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   152
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   153
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   154
//
98
hgs
parents: 96
diff changeset
   155
//TODO temporary sollution for fake uninstall progres notification
hgs
parents: 96
diff changeset
   156
void CCaSrvAppScanner::ClearUninstallFlagL()
hgs
parents: 96
diff changeset
   157
    {
hgs
parents: 96
diff changeset
   158
    CCaInnerQuery* uninstallQuery = CCaInnerQuery::NewLC();
hgs
parents: 96
diff changeset
   159
    uninstallQuery->SetFlagsOn( EUninstall );
hgs
parents: 96
diff changeset
   160
    
hgs
parents: 96
diff changeset
   161
    RPointerArray<CCaInnerEntry> resultArray;
hgs
parents: 96
diff changeset
   162
    CleanupResetAndDestroyPushL( resultArray );
hgs
parents: 96
diff changeset
   163
    iCaStorageProxy.GetEntriesL( uninstallQuery, resultArray );
hgs
parents: 96
diff changeset
   164
    for( TInt i = 0; i < resultArray.Count(); i++ )
hgs
parents: 96
diff changeset
   165
    {
hgs
parents: 96
diff changeset
   166
        resultArray[i]->SetFlags( resultArray[i]->GetFlags() & ~EUninstall );
hgs
parents: 96
diff changeset
   167
        iCaStorageProxy.AddL( resultArray[i] );
hgs
parents: 96
diff changeset
   168
    }
hgs
parents: 96
diff changeset
   169
    CleanupStack::PopAndDestroy( &resultArray );
hgs
parents: 96
diff changeset
   170
    
hgs
parents: 96
diff changeset
   171
    CleanupStack::PopAndDestroy( uninstallQuery );    
hgs
parents: 96
diff changeset
   172
    }
hgs
parents: 96
diff changeset
   173
hgs
parents: 96
diff changeset
   174
// ---------------------------------------------------------
hgs
parents: 96
diff changeset
   175
//
hgs
parents: 96
diff changeset
   176
// ---------------------------------------------------------
hgs
parents: 96
diff changeset
   177
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   178
void CCaSrvAppScanner::RunL()
7feec50967db 201003_02
hgs
parents:
diff changeset
   179
    {
94
hgs
parents: 93
diff changeset
   180
    User::LeaveIfError( iStatus.Int() );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   181
    // AppArc app scan complete, we have the app list.
7feec50967db 201003_02
hgs
parents:
diff changeset
   182
    UpdateApplicationEntriesL();
7feec50967db 201003_02
hgs
parents:
diff changeset
   183
    InstallationNotifyL();
92
hgs
parents: 89
diff changeset
   184
    MakeNotEmptyCollectionsVisibleL();
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   185
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   186
7feec50967db 201003_02
hgs
parents:
diff changeset
   187
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   188
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   189
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   190
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   191
void CCaSrvAppScanner::DoCancel()
7feec50967db 201003_02
hgs
parents:
diff changeset
   192
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   193
    iApaLsSession.CancelListPopulationCompleteObserver();
7feec50967db 201003_02
hgs
parents:
diff changeset
   194
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   195
7feec50967db 201003_02
hgs
parents:
diff changeset
   196
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   197
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   198
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   199
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   200
TInt CCaSrvAppScanner::RunError( TInt /*aError*/)
7feec50967db 201003_02
hgs
parents:
diff changeset
   201
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   202
    // Ignore the error (what else could we do?).
94
hgs
parents: 93
diff changeset
   203
    // When next update occurs, we will run again.
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   204
    return KErrNone;
7feec50967db 201003_02
hgs
parents:
diff changeset
   205
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   206
7feec50967db 201003_02
hgs
parents:
diff changeset
   207
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   208
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   209
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   210
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   211
void CCaSrvAppScanner::UpdateApplicationEntryL(
7feec50967db 201003_02
hgs
parents:
diff changeset
   212
        RPointerArray<CCaInnerEntry>& aCaEntries,
94
hgs
parents: 93
diff changeset
   213
        TUint aAppUid, TUint aMmcId )
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   214
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   215
    RPointerArray<CCaInnerEntry> resultArray;
7feec50967db 201003_02
hgs
parents:
diff changeset
   216
    CleanupResetAndDestroyPushL( resultArray );
94
hgs
parents: 93
diff changeset
   217
    GetCaAppEntriesL( aAppUid, resultArray );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   218
7feec50967db 201003_02
hgs
parents:
diff changeset
   219
    // This app is not in the storage, add it now.
7feec50967db 201003_02
hgs
parents:
diff changeset
   220
    // We don't add hidden items, there are too many of them!
7feec50967db 201003_02
hgs
parents:
diff changeset
   221
    // do not display Menu app
87
hgs
parents: 85
diff changeset
   222
    if( !resultArray.Count() )
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   223
        {
94
hgs
parents: 93
diff changeset
   224
        AddAppEntryL( aAppUid, aMmcId );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   225
        }//if
7feec50967db 201003_02
hgs
parents:
diff changeset
   226
87
hgs
parents: 85
diff changeset
   227
    // "removable", "missing" and "visible"  flags update
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   228
    for( TInt j = 0; j < resultArray.Count(); j++ )
7feec50967db 201003_02
hgs
parents:
diff changeset
   229
        {
94
hgs
parents: 93
diff changeset
   230
        //We need to handle first run of appscanner,
hgs
parents: 93
diff changeset
   231
        //there might be some incorrect data. If this will have impact
hgs
parents: 93
diff changeset
   232
        //on performance we may run this methods only at start up.
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   233
7feec50967db 201003_02
hgs
parents:
diff changeset
   234
        UpdateAppEntryL( resultArray[j], aMmcId );
7feec50967db 201003_02
hgs
parents:
diff changeset
   235
        TInt index = aCaEntries.Find( resultArray[j],
7feec50967db 201003_02
hgs
parents:
diff changeset
   236
                TIdentityRelation<CCaInnerEntry>( IdMatch ) );
7feec50967db 201003_02
hgs
parents:
diff changeset
   237
        if( index != KErrNotFound )
7feec50967db 201003_02
hgs
parents:
diff changeset
   238
            {
7feec50967db 201003_02
hgs
parents:
diff changeset
   239
            delete aCaEntries[index];
7feec50967db 201003_02
hgs
parents:
diff changeset
   240
            aCaEntries.Remove( index );
7feec50967db 201003_02
hgs
parents:
diff changeset
   241
            }
7feec50967db 201003_02
hgs
parents:
diff changeset
   242
        }//for
7feec50967db 201003_02
hgs
parents:
diff changeset
   243
    CleanupStack::PopAndDestroy( &resultArray );
7feec50967db 201003_02
hgs
parents:
diff changeset
   244
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   245
7feec50967db 201003_02
hgs
parents:
diff changeset
   246
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   247
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   248
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   249
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   250
void CCaSrvAppScanner::UpdateAppEntryL( CCaInnerEntry* aEntry, TUint aMmcId )
7feec50967db 201003_02
hgs
parents:
diff changeset
   251
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   252
    TBool toUpdate = HandleMmcAttrUpdateL( aEntry, aMmcId );
93
hgs
parents: 92
diff changeset
   253
    TBool missingVisibleFlagChanged =
hgs
parents: 92
diff changeset
   254
        HandleMissingVisibleFlagsUpdate( aEntry );
hgs
parents: 92
diff changeset
   255
    toUpdate = missingVisibleFlagChanged || toUpdate;
94
hgs
parents: 93
diff changeset
   256
    toUpdate = HandleRemovableVisibleFlagsUpdateL( aEntry ) || toUpdate;
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   257
    toUpdate = SetApaAppInfoL( aEntry ) || toUpdate;
94
hgs
parents: 93
diff changeset
   258
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   259
    if( iInstalledPackages.Find( aEntry->GetUid() ) != KErrNotFound )
7feec50967db 201003_02
hgs
parents:
diff changeset
   260
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   261
        AddEntryToDownloadedCollectionL( aEntry->GetId() );
93
hgs
parents: 92
diff changeset
   262
        toUpdate = HandleUsedFlagUpdate( aEntry ) || toUpdate;
hgs
parents: 92
diff changeset
   263
        AddEntryToPredefinedCollectionL( aEntry, ETrue );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   264
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
   265
    if( toUpdate )
7feec50967db 201003_02
hgs
parents:
diff changeset
   266
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   267
        //update app in storage
93
hgs
parents: 92
diff changeset
   268
        TItemAppearance itemAppearanceChange = EItemAppearanceNotChanged;
hgs
parents: 92
diff changeset
   269
        if( missingVisibleFlagChanged )
hgs
parents: 92
diff changeset
   270
            {
hgs
parents: 92
diff changeset
   271
            itemAppearanceChange = EItemAppeared;
hgs
parents: 92
diff changeset
   272
            }
hgs
parents: 92
diff changeset
   273
        iCaStorageProxy.AddL( aEntry, EFalse, itemAppearanceChange );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   274
        RemoveFromInstalledPackages( aEntry->GetUid() );
7feec50967db 201003_02
hgs
parents:
diff changeset
   275
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
   276
    }
94
hgs
parents: 93
diff changeset
   277
hgs
parents: 93
diff changeset
   278
// ---------------------------------------------------------
hgs
parents: 93
diff changeset
   279
//
hgs
parents: 93
diff changeset
   280
// ---------------------------------------------------------
hgs
parents: 93
diff changeset
   281
//
hgs
parents: 93
diff changeset
   282
TBool CCaSrvAppScanner::HandleMmcAttrUpdateL(
hgs
parents: 93
diff changeset
   283
        CCaInnerEntry* aItem, TUint aMmcId )
hgs
parents: 93
diff changeset
   284
    {
hgs
parents: 93
diff changeset
   285
    TBool toUpdate( ETrue );
hgs
parents: 93
diff changeset
   286
    if( IsInMmcL( TUid::Uid( aItem->GetUid() ) ) )
hgs
parents: 93
diff changeset
   287
        {
hgs
parents: 93
diff changeset
   288
        //app is instaled on mmc - KCaAttrMmcId attribute update
hgs
parents: 93
diff changeset
   289
        RBuf uidString;
hgs
parents: 93
diff changeset
   290
        uidString.CleanupClosePushL();
hgs
parents: 93
diff changeset
   291
        uidString.CreateL(KUidChars);
hgs
parents: 93
diff changeset
   292
        uidString.Format( KHexFormat, aMmcId );
hgs
parents: 93
diff changeset
   293
        aItem->AddAttributeL( KCaAttrMmcId, uidString );
hgs
parents: 93
diff changeset
   294
        CleanupStack::PopAndDestroy( &uidString );
hgs
parents: 93
diff changeset
   295
        }
hgs
parents: 93
diff changeset
   296
    else if ( IsInMassStorageL( TUid::Uid( aItem->GetUid() ) ) )
hgs
parents: 93
diff changeset
   297
        {
hgs
parents: 93
diff changeset
   298
        //its app installed on mass storage, we need to leave it
hgs
parents: 93
diff changeset
   299
        //in case of connecting usb in mass storage mode
hgs
parents: 93
diff changeset
   300
        aItem->AddAttributeL( KCaAttrMmcId, KCaMassStorage );
hgs
parents: 93
diff changeset
   301
        }
hgs
parents: 93
diff changeset
   302
    else
hgs
parents: 93
diff changeset
   303
        {
hgs
parents: 93
diff changeset
   304
        RBuf attrVal;
hgs
parents: 93
diff changeset
   305
        attrVal.CleanupClosePushL();
hgs
parents: 93
diff changeset
   306
        attrVal.CreateL( KCaMaxAttrValueLen );
hgs
parents: 93
diff changeset
   307
        if( aItem->FindAttribute( KCaAttrMmcId, attrVal ) )
hgs
parents: 93
diff changeset
   308
            {
hgs
parents: 93
diff changeset
   309
            aItem->RemoveAttributeL( KCaAttrMmcId );
hgs
parents: 93
diff changeset
   310
            }
hgs
parents: 93
diff changeset
   311
        else
hgs
parents: 93
diff changeset
   312
            {
hgs
parents: 93
diff changeset
   313
            toUpdate = EFalse;
hgs
parents: 93
diff changeset
   314
            }
hgs
parents: 93
diff changeset
   315
        CleanupStack::PopAndDestroy( &attrVal );
hgs
parents: 93
diff changeset
   316
        //its installed on c: drive - remove attribute
hgs
parents: 93
diff changeset
   317
        }
hgs
parents: 93
diff changeset
   318
    return toUpdate;
hgs
parents: 93
diff changeset
   319
    }
hgs
parents: 93
diff changeset
   320
hgs
parents: 93
diff changeset
   321
// ---------------------------------------------------------
hgs
parents: 93
diff changeset
   322
//
hgs
parents: 93
diff changeset
   323
// ---------------------------------------------------------
hgs
parents: 93
diff changeset
   324
//
hgs
parents: 93
diff changeset
   325
void CCaSrvAppScanner::InstallationNotifyL()
hgs
parents: 93
diff changeset
   326
    {
hgs
parents: 93
diff changeset
   327
    for( TInt i = iInstalledPackages.Count() - 1; i >= 0; i-- )
hgs
parents: 93
diff changeset
   328
        {
hgs
parents: 93
diff changeset
   329
        NotifyL( iInstalledPackages[i] );
hgs
parents: 93
diff changeset
   330
        iInstalledPackages.Remove( i );
hgs
parents: 93
diff changeset
   331
        }
hgs
parents: 93
diff changeset
   332
    }
hgs
parents: 93
diff changeset
   333
hgs
parents: 93
diff changeset
   334
// ---------------------------------------------------------
hgs
parents: 93
diff changeset
   335
//
hgs
parents: 93
diff changeset
   336
// ---------------------------------------------------------
hgs
parents: 93
diff changeset
   337
//
hgs
parents: 93
diff changeset
   338
void CCaSrvAppScanner::UpdateApplicationEntriesL()
hgs
parents: 93
diff changeset
   339
    {
hgs
parents: 93
diff changeset
   340
    TUint currentMmcId = UpdateMmcHistoryL();
hgs
parents: 93
diff changeset
   341
    // get all Content arsenal enties with type application
hgs
parents: 93
diff changeset
   342
    RPointerArray<CCaInnerEntry> resultArray;
hgs
parents: 93
diff changeset
   343
    CleanupResetAndDestroyPushL( resultArray );
hgs
parents: 93
diff changeset
   344
    GetCaAppEntriesL( resultArray );
hgs
parents: 93
diff changeset
   345
    HandleHsAppEntryL( resultArray );
hgs
parents: 93
diff changeset
   346
    RemoveSatAppL( resultArray );
hgs
parents: 93
diff changeset
   347
hgs
parents: 93
diff changeset
   348
    RArray<TUint> appUids;
hgs
parents: 93
diff changeset
   349
    CleanupClosePushL( appUids );
hgs
parents: 93
diff changeset
   350
    GetApaItemsL( appUids );
hgs
parents: 93
diff changeset
   351
    RemoveApp( appUids, KSatUid.iUid );
hgs
parents: 93
diff changeset
   352
    RemoveApp( appUids, KHsAppUid.iUid );
hgs
parents: 93
diff changeset
   353
hgs
parents: 93
diff changeset
   354
    //for every item in apaAndCrItems array
hgs
parents: 93
diff changeset
   355
    for( TInt i = 0; i < appUids.Count(); i++ )
hgs
parents: 93
diff changeset
   356
        {
hgs
parents: 93
diff changeset
   357
        // if there was leave for any item we ignore it
hgs
parents: 93
diff changeset
   358
        // and proceed to the next one
hgs
parents: 93
diff changeset
   359
        TRAP_IGNORE(UpdateApplicationEntryL(
hgs
parents: 93
diff changeset
   360
                resultArray, appUids[i], currentMmcId));
hgs
parents: 93
diff changeset
   361
        }
hgs
parents: 93
diff changeset
   362
    // Here the big list with items that refer to missing apps.
hgs
parents: 93
diff changeset
   363
    HandleMissingItemsL( resultArray );
hgs
parents: 93
diff changeset
   364
    CleanupStack::PopAndDestroy( &appUids );
hgs
parents: 93
diff changeset
   365
    CleanupStack::PopAndDestroy( &resultArray );
hgs
parents: 93
diff changeset
   366
    }
hgs
parents: 93
diff changeset
   367
hgs
parents: 93
diff changeset
   368
// ---------------------------------------------------------
hgs
parents: 93
diff changeset
   369
//
hgs
parents: 93
diff changeset
   370
// ---------------------------------------------------------
hgs
parents: 93
diff changeset
   371
//
hgs
parents: 93
diff changeset
   372
TBool CCaSrvAppScanner::HandleRemovableVisibleFlagsUpdateL(
hgs
parents: 93
diff changeset
   373
        CCaInnerEntry* aItem )
hgs
parents: 93
diff changeset
   374
    {
hgs
parents: 93
diff changeset
   375
    TBool toChange( EFalse );
hgs
parents: 93
diff changeset
   376
    if( ( aItem->GetFlags() & EVisible ) && IsInRomL( aItem->GetUid() ) )
hgs
parents: 93
diff changeset
   377
        {
hgs
parents: 93
diff changeset
   378
        if( ( aItem->GetFlags() & ERemovable ) != 0 )
hgs
parents: 93
diff changeset
   379
            {
hgs
parents: 93
diff changeset
   380
            aItem->SetFlags( aItem->GetFlags() & ~ERemovable );
hgs
parents: 93
diff changeset
   381
            toChange = ETrue;
hgs
parents: 93
diff changeset
   382
            }
hgs
parents: 93
diff changeset
   383
        }
hgs
parents: 93
diff changeset
   384
    else
hgs
parents: 93
diff changeset
   385
        {
hgs
parents: 93
diff changeset
   386
        if( ( aItem->GetFlags() & ERemovable ) == 0 )
hgs
parents: 93
diff changeset
   387
            {
hgs
parents: 93
diff changeset
   388
            aItem->SetFlags( aItem->GetFlags() | ERemovable );
hgs
parents: 93
diff changeset
   389
            toChange = ETrue;
hgs
parents: 93
diff changeset
   390
            }
hgs
parents: 93
diff changeset
   391
        }
hgs
parents: 93
diff changeset
   392
    return toChange;
hgs
parents: 93
diff changeset
   393
    }
hgs
parents: 93
diff changeset
   394
hgs
parents: 93
diff changeset
   395
// ---------------------------------------------------------
hgs
parents: 93
diff changeset
   396
//
hgs
parents: 93
diff changeset
   397
// ---------------------------------------------------------
hgs
parents: 93
diff changeset
   398
//
hgs
parents: 93
diff changeset
   399
TBool CCaSrvAppScanner::HandleMissingVisibleFlagsUpdate(
hgs
parents: 93
diff changeset
   400
        CCaInnerEntry* aItem )
hgs
parents: 93
diff changeset
   401
    {
hgs
parents: 93
diff changeset
   402
    TBool ret( EFalse );
hgs
parents: 93
diff changeset
   403
    if( aItem->GetFlags() & EMissing ||
hgs
parents: 93
diff changeset
   404
        !( aItem->GetFlags() & EVisible ) )
hgs
parents: 93
diff changeset
   405
        {
hgs
parents: 93
diff changeset
   406
        //application found so we unset "missing" and set "visible" flags
hgs
parents: 93
diff changeset
   407
        aItem->SetFlags( aItem->GetFlags() & ~EMissing | EVisible );
hgs
parents: 93
diff changeset
   408
        ret = ETrue;
hgs
parents: 93
diff changeset
   409
        }
hgs
parents: 93
diff changeset
   410
    return ret;
hgs
parents: 93
diff changeset
   411
    }
hgs
parents: 93
diff changeset
   412
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   413
// ---------------------------------------------------------
93
hgs
parents: 92
diff changeset
   414
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   415
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   416
//
93
hgs
parents: 92
diff changeset
   417
TBool CCaSrvAppScanner::HandleVisibleFlagUpdate( CCaInnerEntry* aItem )
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   418
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   419
    TBool toChange( EFalse );
93
hgs
parents: 92
diff changeset
   420
    if( !( aItem->GetFlags() & EVisible ) )
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   421
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   422
        aItem->SetFlags( aItem->GetFlags() | EVisible );
7feec50967db 201003_02
hgs
parents:
diff changeset
   423
        toChange = ETrue;
7feec50967db 201003_02
hgs
parents:
diff changeset
   424
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
   425
    return toChange;
7feec50967db 201003_02
hgs
parents:
diff changeset
   426
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   427
7feec50967db 201003_02
hgs
parents:
diff changeset
   428
// ---------------------------------------------------------
93
hgs
parents: 92
diff changeset
   429
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   430
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   431
//
93
hgs
parents: 92
diff changeset
   432
TBool CCaSrvAppScanner::HandleUsedFlagUpdate( CCaInnerEntry* aItem )
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   433
    {
93
hgs
parents: 92
diff changeset
   434
    TBool changed( EFalse );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   435
    if( aItem->GetFlags() & EUsed )
7feec50967db 201003_02
hgs
parents:
diff changeset
   436
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   437
        aItem->SetFlags( aItem->GetFlags() & ~EUsed );
93
hgs
parents: 92
diff changeset
   438
        changed = ETrue;
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   439
        }
93
hgs
parents: 92
diff changeset
   440
    return changed;
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   441
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   442
7feec50967db 201003_02
hgs
parents:
diff changeset
   443
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   444
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   445
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   446
//
94
hgs
parents: 93
diff changeset
   447
void CCaSrvAppScanner::RemoveApp( RArray<TUint>& aArray, TInt32 aUid )
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   448
    {
94
hgs
parents: 93
diff changeset
   449
    TInt id = aArray.Find( aUid );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   450
    if( id != KErrNotFound )
7feec50967db 201003_02
hgs
parents:
diff changeset
   451
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   452
        aArray.Remove( id );
7feec50967db 201003_02
hgs
parents:
diff changeset
   453
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
   454
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   455
7feec50967db 201003_02
hgs
parents:
diff changeset
   456
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   457
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   458
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   459
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   460
void CCaSrvAppScanner::RemoveSatAppL( RPointerArray<CCaInnerEntry>& aArray )
7feec50967db 201003_02
hgs
parents:
diff changeset
   461
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   462
    CCaInnerEntry* sat = CCaInnerEntry::NewL();
7feec50967db 201003_02
hgs
parents:
diff changeset
   463
    sat->SetUid( KSatUid.iUid );
7feec50967db 201003_02
hgs
parents:
diff changeset
   464
    TInt index = aArray.Find(
7feec50967db 201003_02
hgs
parents:
diff changeset
   465
            sat, TIdentityRelation<CCaInnerEntry>( UidMatch ) );
7feec50967db 201003_02
hgs
parents:
diff changeset
   466
    if ( index != KErrNotFound )
7feec50967db 201003_02
hgs
parents:
diff changeset
   467
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   468
        delete aArray[index];
7feec50967db 201003_02
hgs
parents:
diff changeset
   469
        aArray.Remove( index );
7feec50967db 201003_02
hgs
parents:
diff changeset
   470
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
   471
    delete sat;
7feec50967db 201003_02
hgs
parents:
diff changeset
   472
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   473
7feec50967db 201003_02
hgs
parents:
diff changeset
   474
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   475
//
87
hgs
parents: 85
diff changeset
   476
// ---------------------------------------------------------
hgs
parents: 85
diff changeset
   477
//
94
hgs
parents: 93
diff changeset
   478
void CCaSrvAppScanner::HandleHsAppEntryL(
hgs
parents: 93
diff changeset
   479
        RPointerArray<CCaInnerEntry>& aArray )
87
hgs
parents: 85
diff changeset
   480
    {
hgs
parents: 85
diff changeset
   481
    CCaInnerEntry* appEntry = CCaInnerEntry::NewLC();
hgs
parents: 85
diff changeset
   482
    appEntry->SetUid( KHsAppUid.iUid );
hgs
parents: 85
diff changeset
   483
    TInt index = aArray.Find(
hgs
parents: 85
diff changeset
   484
            appEntry, TIdentityRelation<CCaInnerEntry>( UidMatch ) );
92
hgs
parents: 89
diff changeset
   485
87
hgs
parents: 85
diff changeset
   486
    if ( index != KErrNotFound )
93
hgs
parents: 92
diff changeset
   487
        {
hgs
parents: 92
diff changeset
   488
        // hs app already in storage - ensure it is hidden
hgs
parents: 92
diff changeset
   489
        // and remove from resultArray
hgs
parents: 92
diff changeset
   490
        if ( aArray[index]->GetFlags() & EVisible )
87
hgs
parents: 85
diff changeset
   491
            {
hgs
parents: 85
diff changeset
   492
            aArray[index]->SetFlags( aArray[index]->GetFlags() & ~EVisible);
93
hgs
parents: 92
diff changeset
   493
            iCaStorageProxy.AddL( aArray[index], EFalse, EItemDisappeared );
92
hgs
parents: 89
diff changeset
   494
            }
87
hgs
parents: 85
diff changeset
   495
        delete aArray[index];
92
hgs
parents: 89
diff changeset
   496
        aArray.Remove( index );
87
hgs
parents: 85
diff changeset
   497
        }
hgs
parents: 85
diff changeset
   498
    else
93
hgs
parents: 92
diff changeset
   499
        {
hgs
parents: 92
diff changeset
   500
        // if not found add as not visible to the storage
87
hgs
parents: 85
diff changeset
   501
        appEntry->SetEntryTypeNameL( KCaTypeApp );
92
hgs
parents: 89
diff changeset
   502
        appEntry->SetFlags( 0 );
87
hgs
parents: 85
diff changeset
   503
        appEntry->SetRole( EItemEntryRole );
hgs
parents: 85
diff changeset
   504
        SetApaAppInfoL( appEntry );
hgs
parents: 85
diff changeset
   505
        iCaStorageProxy.AddL( appEntry );
hgs
parents: 85
diff changeset
   506
        }
hgs
parents: 85
diff changeset
   507
    CleanupStack::PopAndDestroy( appEntry );
hgs
parents: 85
diff changeset
   508
    }
hgs
parents: 85
diff changeset
   509
hgs
parents: 85
diff changeset
   510
hgs
parents: 85
diff changeset
   511
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   512
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   513
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   514
//
94
hgs
parents: 93
diff changeset
   515
void CCaSrvAppScanner::GetApaItemsL( RArray<TUint>& aArray )
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   516
    {
94
hgs
parents: 93
diff changeset
   517
    TApaAppInfo* appInfo = new ( ELeave ) TApaAppInfo();
92
hgs
parents: 89
diff changeset
   518
    CleanupStack::PushL(appInfo);
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   519
    TApaAppCapabilityBuf appCap;
7feec50967db 201003_02
hgs
parents:
diff changeset
   520
7feec50967db 201003_02
hgs
parents:
diff changeset
   521
    User::LeaveIfError( iApaLsSession.GetAllApps( 0 ) );
7feec50967db 201003_02
hgs
parents:
diff changeset
   522
    // for every application get uid, hidden and missing attribute
7feec50967db 201003_02
hgs
parents:
diff changeset
   523
    // and add to aArray.
92
hgs
parents: 89
diff changeset
   524
    while( KErrNone == iApaLsSession.GetNextApp( *appInfo ) )
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   525
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   526
        User::LeaveIfError( iApaLsSession.GetAppCapability(
92
hgs
parents: 89
diff changeset
   527
                appCap, appInfo->iUid ) );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   528
        // "Hidden" status according to AppArc.
7feec50967db 201003_02
hgs
parents:
diff changeset
   529
        if( !appCap().iAppIsHidden )
7feec50967db 201003_02
hgs
parents:
diff changeset
   530
            {
94
hgs
parents: 93
diff changeset
   531
            aArray.AppendL( appInfo->iUid.iUid );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   532
            }
7feec50967db 201003_02
hgs
parents:
diff changeset
   533
        }
92
hgs
parents: 89
diff changeset
   534
    CleanupStack::PopAndDestroy(appInfo);
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   535
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   536
7feec50967db 201003_02
hgs
parents:
diff changeset
   537
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   538
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   539
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   540
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   541
void CCaSrvAppScanner::GetCaAppEntriesL(
7feec50967db 201003_02
hgs
parents:
diff changeset
   542
        RPointerArray<CCaInnerEntry>& aArray )
7feec50967db 201003_02
hgs
parents:
diff changeset
   543
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   544
    CCaInnerQuery* allAppQuery = CCaInnerQuery::NewLC();
94
hgs
parents: 93
diff changeset
   545
    CDesC16ArrayFlat* appType =
hgs
parents: 93
diff changeset
   546
            new ( ELeave ) CDesC16ArrayFlat( KGranularityOne );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   547
    CleanupStack::PushL( appType );
7feec50967db 201003_02
hgs
parents:
diff changeset
   548
    appType->AppendL( KCaTypeApp );
7feec50967db 201003_02
hgs
parents:
diff changeset
   549
    allAppQuery->SetEntryTypeNames( appType );
7feec50967db 201003_02
hgs
parents:
diff changeset
   550
    CleanupStack::Pop( appType );
7feec50967db 201003_02
hgs
parents:
diff changeset
   551
    iCaStorageProxy.GetEntriesL( allAppQuery, aArray );
7feec50967db 201003_02
hgs
parents:
diff changeset
   552
    CleanupStack::PopAndDestroy( allAppQuery );
7feec50967db 201003_02
hgs
parents:
diff changeset
   553
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   554
7feec50967db 201003_02
hgs
parents:
diff changeset
   555
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   556
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   557
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   558
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   559
TInt CCaSrvAppScanner::GetCollectionDownloadIdL()
7feec50967db 201003_02
hgs
parents:
diff changeset
   560
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   561
    if( iCollectionDownloadId == 0 )
7feec50967db 201003_02
hgs
parents:
diff changeset
   562
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   563
        RPointerArray<CCaInnerEntry> resultArray;
7feec50967db 201003_02
hgs
parents:
diff changeset
   564
        CleanupResetAndDestroyPushL( resultArray );
7feec50967db 201003_02
hgs
parents:
diff changeset
   565
        CCaInnerQuery* allAppQuery = CCaInnerQuery::NewLC();
94
hgs
parents: 93
diff changeset
   566
        CDesC16ArrayFlat* appType =
hgs
parents: 93
diff changeset
   567
                new ( ELeave ) CDesC16ArrayFlat( KGranularityOne );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   568
        CleanupStack::PushL( appType );
7feec50967db 201003_02
hgs
parents:
diff changeset
   569
        appType->AppendL( KCaTypeCollectionDownload );
7feec50967db 201003_02
hgs
parents:
diff changeset
   570
        allAppQuery->SetEntryTypeNames( appType );
7feec50967db 201003_02
hgs
parents:
diff changeset
   571
        CleanupStack::Pop( appType );
7feec50967db 201003_02
hgs
parents:
diff changeset
   572
        iCaStorageProxy.GetEntriesL( allAppQuery, resultArray );
7feec50967db 201003_02
hgs
parents:
diff changeset
   573
        CleanupStack::PopAndDestroy( allAppQuery );
7feec50967db 201003_02
hgs
parents:
diff changeset
   574
        if( resultArray.Count() )
7feec50967db 201003_02
hgs
parents:
diff changeset
   575
            {
7feec50967db 201003_02
hgs
parents:
diff changeset
   576
            iCollectionDownloadId = resultArray[0]->GetId();
7feec50967db 201003_02
hgs
parents:
diff changeset
   577
            }
7feec50967db 201003_02
hgs
parents:
diff changeset
   578
        CleanupStack::PopAndDestroy( &resultArray );
7feec50967db 201003_02
hgs
parents:
diff changeset
   579
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
   580
    return iCollectionDownloadId;
7feec50967db 201003_02
hgs
parents:
diff changeset
   581
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   582
7feec50967db 201003_02
hgs
parents:
diff changeset
   583
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   584
//
92
hgs
parents: 89
diff changeset
   585
// ---------------------------------------------------------
hgs
parents: 89
diff changeset
   586
//
hgs
parents: 89
diff changeset
   587
TInt CCaSrvAppScanner::GetAllCollectionIdL()
hgs
parents: 89
diff changeset
   588
    {
hgs
parents: 89
diff changeset
   589
    if( iAllCollectionId == 0 )
hgs
parents: 89
diff changeset
   590
        {
hgs
parents: 89
diff changeset
   591
        CCaInnerQuery *getAllCollectionIdQuery = CCaInnerQuery::NewLC();
hgs
parents: 89
diff changeset
   592
        CDesC16ArrayFlat *typenameArray = new(ELeave) CDesC16ArrayFlat(
94
hgs
parents: 93
diff changeset
   593
                KGranularityOne );
92
hgs
parents: 89
diff changeset
   594
        CleanupStack::PushL( typenameArray );
hgs
parents: 89
diff changeset
   595
        typenameArray->AppendL( KCaTypeMenuCollections );
hgs
parents: 89
diff changeset
   596
        getAllCollectionIdQuery->SetEntryTypeNames( typenameArray );
hgs
parents: 89
diff changeset
   597
        CleanupStack::Pop( typenameArray );
93
hgs
parents: 92
diff changeset
   598
92
hgs
parents: 89
diff changeset
   599
        RArray<TInt> idArray;
hgs
parents: 89
diff changeset
   600
        CleanupClosePushL( idArray );
hgs
parents: 89
diff changeset
   601
        iCaStorageProxy.GetEntriesIdsL( getAllCollectionIdQuery,
hgs
parents: 89
diff changeset
   602
                idArray );
hgs
parents: 89
diff changeset
   603
        if( idArray.Count() )
hgs
parents: 89
diff changeset
   604
            {
hgs
parents: 89
diff changeset
   605
            iAllCollectionId = idArray[0];
hgs
parents: 89
diff changeset
   606
            }
hgs
parents: 89
diff changeset
   607
        CleanupStack::PopAndDestroy( &idArray );
hgs
parents: 89
diff changeset
   608
        CleanupStack::PopAndDestroy( getAllCollectionIdQuery );
hgs
parents: 89
diff changeset
   609
        }
hgs
parents: 89
diff changeset
   610
    return iAllCollectionId;
hgs
parents: 89
diff changeset
   611
    }
hgs
parents: 89
diff changeset
   612
hgs
parents: 89
diff changeset
   613
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   614
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   615
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   616
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   617
void CCaSrvAppScanner::GetCaAppEntriesL( TInt aUid,
7feec50967db 201003_02
hgs
parents:
diff changeset
   618
        RPointerArray<CCaInnerEntry>& aArray )
7feec50967db 201003_02
hgs
parents:
diff changeset
   619
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   620
    CCaInnerQuery* allAppQuery = CCaInnerQuery::NewLC();
7feec50967db 201003_02
hgs
parents:
diff changeset
   621
    allAppQuery->SetUid( aUid );
7feec50967db 201003_02
hgs
parents:
diff changeset
   622
    iCaStorageProxy.GetEntriesL( allAppQuery, aArray );
7feec50967db 201003_02
hgs
parents:
diff changeset
   623
    CleanupStack::PopAndDestroy( allAppQuery );
7feec50967db 201003_02
hgs
parents:
diff changeset
   624
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   625
7feec50967db 201003_02
hgs
parents:
diff changeset
   626
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   627
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   628
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   629
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   630
void CCaSrvAppScanner::HandleAppListEvent( TInt /*aEvent*/)
7feec50967db 201003_02
hgs
parents:
diff changeset
   631
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   632
    // We only have one event, EAppListChanged.
7feec50967db 201003_02
hgs
parents:
diff changeset
   633
    // Call back RunL async, to requeue and initiate rescan.
7feec50967db 201003_02
hgs
parents:
diff changeset
   634
    if( !IsActive() )
7feec50967db 201003_02
hgs
parents:
diff changeset
   635
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   636
        ScheduleScan();
7feec50967db 201003_02
hgs
parents:
diff changeset
   637
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
   638
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   639
7feec50967db 201003_02
hgs
parents:
diff changeset
   640
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   641
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   642
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   643
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   644
void CCaSrvAppScanner::HandleInstallNotifyL( TInt aUid )
7feec50967db 201003_02
hgs
parents:
diff changeset
   645
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   646
    NotifyL( aUid );
7feec50967db 201003_02
hgs
parents:
diff changeset
   647
    RArray<TUid> uids;
7feec50967db 201003_02
hgs
parents:
diff changeset
   648
    CleanupClosePushL( uids );
7feec50967db 201003_02
hgs
parents:
diff changeset
   649
7feec50967db 201003_02
hgs
parents:
diff changeset
   650
    Swi::RSisRegistrySession iSisRegSession;
94
hgs
parents: 93
diff changeset
   651
    CleanupClosePushL( iSisRegSession );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   652
    User::LeaveIfError( iSisRegSession.Connect() );
7feec50967db 201003_02
hgs
parents:
diff changeset
   653
7feec50967db 201003_02
hgs
parents:
diff changeset
   654
    // Open sis package entry related to aUid
7feec50967db 201003_02
hgs
parents:
diff changeset
   655
    Swi::RSisRegistryEntry packageEntry;
7feec50967db 201003_02
hgs
parents:
diff changeset
   656
    if( KErrNone
7feec50967db 201003_02
hgs
parents:
diff changeset
   657
            == packageEntry.Open( iSisRegSession, TUid::Uid( aUid ) ) )
7feec50967db 201003_02
hgs
parents:
diff changeset
   658
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   659
        CleanupClosePushL( packageEntry );
7feec50967db 201003_02
hgs
parents:
diff changeset
   660
7feec50967db 201003_02
hgs
parents:
diff changeset
   661
        // Get packageEntry's embedded sis'
7feec50967db 201003_02
hgs
parents:
diff changeset
   662
        RPointerArray<Swi::CSisRegistryPackage> embedded;
94
hgs
parents: 93
diff changeset
   663
        CleanupResetAndDestroyPushL( embedded );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   664
        packageEntry.EmbeddedPackagesL( embedded );
7feec50967db 201003_02
hgs
parents:
diff changeset
   665
        if( embedded.Count() )
7feec50967db 201003_02
hgs
parents:
diff changeset
   666
            {
7feec50967db 201003_02
hgs
parents:
diff changeset
   667
            // For each embadded sis we notify storage - recursive call
7feec50967db 201003_02
hgs
parents:
diff changeset
   668
            for( TInt i = 0; i < embedded.Count(); ++i )
7feec50967db 201003_02
hgs
parents:
diff changeset
   669
                {
7feec50967db 201003_02
hgs
parents:
diff changeset
   670
                HandleInstallNotifyL( embedded[i]->Uid().iUid );
7feec50967db 201003_02
hgs
parents:
diff changeset
   671
                }
7feec50967db 201003_02
hgs
parents:
diff changeset
   672
            }
7feec50967db 201003_02
hgs
parents:
diff changeset
   673
        else
7feec50967db 201003_02
hgs
parents:
diff changeset
   674
            {
7feec50967db 201003_02
hgs
parents:
diff changeset
   675
            // There are no embaddes sis', so we can notify storage
7feec50967db 201003_02
hgs
parents:
diff changeset
   676
            // of changes in apps included in packageEntry
7feec50967db 201003_02
hgs
parents:
diff changeset
   677
            NotifyL( packageEntry );
7feec50967db 201003_02
hgs
parents:
diff changeset
   678
            }
7feec50967db 201003_02
hgs
parents:
diff changeset
   679
        CleanupStack::PopAndDestroy( &embedded );
7feec50967db 201003_02
hgs
parents:
diff changeset
   680
        CleanupStack::PopAndDestroy( &packageEntry );
7feec50967db 201003_02
hgs
parents:
diff changeset
   681
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
   682
    CleanupStack::PopAndDestroy( &iSisRegSession );
7feec50967db 201003_02
hgs
parents:
diff changeset
   683
    CleanupStack::PopAndDestroy( &uids );
7feec50967db 201003_02
hgs
parents:
diff changeset
   684
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   685
7feec50967db 201003_02
hgs
parents:
diff changeset
   686
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   687
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   688
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   689
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   690
void CCaSrvAppScanner::NotifyL( Swi::RSisRegistryEntry & aPackageEntry )
7feec50967db 201003_02
hgs
parents:
diff changeset
   691
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   692
    // Get sids ( == uids of exetucables included in aPackageEntry )
7feec50967db 201003_02
hgs
parents:
diff changeset
   693
    RArray<TUid> sids;
7feec50967db 201003_02
hgs
parents:
diff changeset
   694
    CleanupClosePushL( sids );
7feec50967db 201003_02
hgs
parents:
diff changeset
   695
    aPackageEntry.SidsL( sids );
7feec50967db 201003_02
hgs
parents:
diff changeset
   696
    if( sids.Count() )
7feec50967db 201003_02
hgs
parents:
diff changeset
   697
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   698
        // For each sid we notify storage
7feec50967db 201003_02
hgs
parents:
diff changeset
   699
        for( TInt i = 0; i < sids.Count(); ++i )
7feec50967db 201003_02
hgs
parents:
diff changeset
   700
            {
7feec50967db 201003_02
hgs
parents:
diff changeset
   701
            iInstalledPackages.Append( sids[i].iUid );
7feec50967db 201003_02
hgs
parents:
diff changeset
   702
            }
7feec50967db 201003_02
hgs
parents:
diff changeset
   703
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
   704
    CleanupStack::PopAndDestroy( &sids );
7feec50967db 201003_02
hgs
parents:
diff changeset
   705
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   706
7feec50967db 201003_02
hgs
parents:
diff changeset
   707
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   708
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   709
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   710
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   711
void CCaSrvAppScanner::NotifyL( TInt aAppUid )
7feec50967db 201003_02
hgs
parents:
diff changeset
   712
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   713
    // Get entries for given aAppUid
7feec50967db 201003_02
hgs
parents:
diff changeset
   714
    RPointerArray<CCaInnerEntry> resultArray;
7feec50967db 201003_02
hgs
parents:
diff changeset
   715
    CleanupResetAndDestroyPushL( resultArray );
7feec50967db 201003_02
hgs
parents:
diff changeset
   716
    GetCaAppEntriesL( aAppUid, resultArray );
93
hgs
parents: 92
diff changeset
   717
    if( resultArray.Count() && ( resultArray[0]->GetFlags() & EVisible ) )
94
hgs
parents: 93
diff changeset
   718
        {//TODO: this only for icons. This functionality should be change
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   719
        iCaStorageProxy.AddL( resultArray[0] );
7feec50967db 201003_02
hgs
parents:
diff changeset
   720
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
   721
    CleanupStack::PopAndDestroy( &resultArray );
7feec50967db 201003_02
hgs
parents:
diff changeset
   722
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   723
7feec50967db 201003_02
hgs
parents:
diff changeset
   724
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   725
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   726
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   727
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   728
void CCaSrvAppScanner::AddEntryToDownloadedCollectionL( TInt aEntryId )
7feec50967db 201003_02
hgs
parents:
diff changeset
   729
    {
94
hgs
parents: 93
diff changeset
   730
    TCaOperationParams params;
hgs
parents: 93
diff changeset
   731
    params.iOperationType = TCaOperationParams::EPrepend;
hgs
parents: 93
diff changeset
   732
    params.iGroupId = GetCollectionDownloadIdL();
hgs
parents: 93
diff changeset
   733
    params.iBeforeEntryId = 0; // Not used.
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   734
7feec50967db 201003_02
hgs
parents:
diff changeset
   735
    RArray<TInt> entryIds;
7feec50967db 201003_02
hgs
parents:
diff changeset
   736
    CleanupClosePushL( entryIds );
7feec50967db 201003_02
hgs
parents:
diff changeset
   737
    entryIds.AppendL( aEntryId );
7feec50967db 201003_02
hgs
parents:
diff changeset
   738
    iCaStorageProxy.OrganizeL( entryIds, params );
7feec50967db 201003_02
hgs
parents:
diff changeset
   739
7feec50967db 201003_02
hgs
parents:
diff changeset
   740
    CleanupStack::PopAndDestroy( &entryIds );
7feec50967db 201003_02
hgs
parents:
diff changeset
   741
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   742
7feec50967db 201003_02
hgs
parents:
diff changeset
   743
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   744
//
92
hgs
parents: 89
diff changeset
   745
// ---------------------------------------------------------
hgs
parents: 89
diff changeset
   746
//
hgs
parents: 89
diff changeset
   747
void CCaSrvAppScanner::AddEntryToPredefinedCollectionL(
hgs
parents: 89
diff changeset
   748
        CCaInnerEntry* aEntry, TBool aUpdate )
hgs
parents: 89
diff changeset
   749
    {
hgs
parents: 89
diff changeset
   750
    TApaAppCapabilityBuf capability;
hgs
parents: 89
diff changeset
   751
    User::LeaveIfError( iApaLsSession.GetAppCapability( capability,
hgs
parents: 89
diff changeset
   752
            TUid::Uid( aEntry->GetUid() ) ) );
hgs
parents: 89
diff changeset
   753
hgs
parents: 89
diff changeset
   754
    if( capability().iGroupName.Length() )
hgs
parents: 89
diff changeset
   755
        {
hgs
parents: 89
diff changeset
   756
        // appgroup_name is defined for this app. Find or create folder.
hgs
parents: 89
diff changeset
   757
        CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC();
93
hgs
parents: 92
diff changeset
   758
        innerQuery->SetRole( CCaInnerQuery::Group );
92
hgs
parents: 89
diff changeset
   759
        innerQuery->AddAttributeL( KCaAppGroupName,
hgs
parents: 89
diff changeset
   760
                capability().iGroupName );
93
hgs
parents: 92
diff changeset
   761
92
hgs
parents: 89
diff changeset
   762
        // get entries by attributes
hgs
parents: 89
diff changeset
   763
        RPointerArray<CCaInnerEntry> resultArrayItems;
hgs
parents: 89
diff changeset
   764
        CleanupResetAndDestroyPushL( resultArrayItems );
hgs
parents: 89
diff changeset
   765
        iCaStorageProxy.GetEntriesL( innerQuery, resultArrayItems );
hgs
parents: 89
diff changeset
   766
hgs
parents: 89
diff changeset
   767
        RArray<TInt> entryIds;
hgs
parents: 89
diff changeset
   768
        CleanupClosePushL( entryIds );
94
hgs
parents: 93
diff changeset
   769
        entryIds.AppendL( aEntry->GetId() );
92
hgs
parents: 89
diff changeset
   770
        TCaOperationParams organizeParams;
hgs
parents: 89
diff changeset
   771
        organizeParams.iBeforeEntryId = 0;
94
hgs
parents: 93
diff changeset
   772
        organizeParams.iOperationType = TCaOperationParams::EAppend;
93
hgs
parents: 92
diff changeset
   773
92
hgs
parents: 89
diff changeset
   774
        if( resultArrayItems.Count() )
hgs
parents: 89
diff changeset
   775
            {
93
hgs
parents: 92
diff changeset
   776
            // collection with appgroup_name exist - add entry
92
hgs
parents: 89
diff changeset
   777
            // to this collection
hgs
parents: 89
diff changeset
   778
            organizeParams.iGroupId = resultArrayItems[0]->GetId();
hgs
parents: 89
diff changeset
   779
            }
hgs
parents: 89
diff changeset
   780
        else
hgs
parents: 89
diff changeset
   781
            {
hgs
parents: 89
diff changeset
   782
            // create new collection
hgs
parents: 89
diff changeset
   783
            TInt predefinedCollectionId = CreatePredefinedCollectionL(
hgs
parents: 89
diff changeset
   784
                    capability().iGroupName );
93
hgs
parents: 92
diff changeset
   785
92
hgs
parents: 89
diff changeset
   786
            organizeParams.iGroupId = predefinedCollectionId;
hgs
parents: 89
diff changeset
   787
93
hgs
parents: 92
diff changeset
   788
            // add new collection to all collection
92
hgs
parents: 89
diff changeset
   789
            AddCollectionToAllCollectionL( predefinedCollectionId );
93
hgs
parents: 92
diff changeset
   790
92
hgs
parents: 89
diff changeset
   791
            if( aUpdate )
hgs
parents: 89
diff changeset
   792
                {
hgs
parents: 89
diff changeset
   793
                iCaStorageProxy.OrganizeL( entryIds, organizeParams );
hgs
parents: 89
diff changeset
   794
                }
hgs
parents: 89
diff changeset
   795
            }
93
hgs
parents: 92
diff changeset
   796
92
hgs
parents: 89
diff changeset
   797
        if( !aUpdate )
hgs
parents: 89
diff changeset
   798
            {
hgs
parents: 89
diff changeset
   799
            iCaStorageProxy.OrganizeL( entryIds, organizeParams );
hgs
parents: 89
diff changeset
   800
            }
93
hgs
parents: 92
diff changeset
   801
92
hgs
parents: 89
diff changeset
   802
        CleanupStack::PopAndDestroy( &entryIds );
hgs
parents: 89
diff changeset
   803
        CleanupStack::PopAndDestroy( &resultArrayItems );
hgs
parents: 89
diff changeset
   804
        CleanupStack::PopAndDestroy( innerQuery );
93
hgs
parents: 92
diff changeset
   805
        }
92
hgs
parents: 89
diff changeset
   806
    }
hgs
parents: 89
diff changeset
   807
hgs
parents: 89
diff changeset
   808
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   809
//
92
hgs
parents: 89
diff changeset
   810
// ---------------------------------------------------------
hgs
parents: 89
diff changeset
   811
//
hgs
parents: 89
diff changeset
   812
TInt CCaSrvAppScanner::CreatePredefinedCollectionL( const TDesC& aGroupName )
hgs
parents: 89
diff changeset
   813
    {
hgs
parents: 89
diff changeset
   814
    CCaInnerEntry *innerEntry = CCaInnerEntry::NewLC();
hgs
parents: 89
diff changeset
   815
    innerEntry->SetTextL( aGroupName );
hgs
parents: 89
diff changeset
   816
    innerEntry->SetEntryTypeNameL( KCaTypeCollection );
hgs
parents: 89
diff changeset
   817
    innerEntry->SetRole( CCaInnerQuery::Group );
hgs
parents: 89
diff changeset
   818
    innerEntry->AddAttributeL( KCaAppGroupName, aGroupName );
94
hgs
parents: 93
diff changeset
   819
    innerEntry->SetFlags( EVisible | ERemovable );
92
hgs
parents: 89
diff changeset
   820
    innerEntry->SetIconDataL( KCollectionIconFileName,
hgs
parents: 89
diff changeset
   821
            KNullDesC, KNullDesC );
hgs
parents: 89
diff changeset
   822
    iCaStorageProxy.AddL( innerEntry );
hgs
parents: 89
diff changeset
   823
    // Get new collection Id
hgs
parents: 89
diff changeset
   824
    TInt newCollectionId = innerEntry->GetId();
hgs
parents: 89
diff changeset
   825
    CleanupStack::PopAndDestroy( innerEntry );
93
hgs
parents: 92
diff changeset
   826
92
hgs
parents: 89
diff changeset
   827
    return newCollectionId;
hgs
parents: 89
diff changeset
   828
    }
hgs
parents: 89
diff changeset
   829
hgs
parents: 89
diff changeset
   830
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   831
//
92
hgs
parents: 89
diff changeset
   832
// ---------------------------------------------------------
hgs
parents: 89
diff changeset
   833
//
hgs
parents: 89
diff changeset
   834
void CCaSrvAppScanner::AddCollectionToAllCollectionL( TInt aCollectionId )
hgs
parents: 89
diff changeset
   835
    {
hgs
parents: 89
diff changeset
   836
    RArray<TInt> entryIds;
hgs
parents: 89
diff changeset
   837
    CleanupClosePushL( entryIds );
hgs
parents: 89
diff changeset
   838
    entryIds.AppendL( aCollectionId );
93
hgs
parents: 92
diff changeset
   839
92
hgs
parents: 89
diff changeset
   840
    TCaOperationParams organizeParams;
hgs
parents: 89
diff changeset
   841
    organizeParams.iBeforeEntryId = 0;
hgs
parents: 89
diff changeset
   842
    organizeParams.iOperationType = TCaOperationParams::EAppend;
hgs
parents: 89
diff changeset
   843
    organizeParams.iGroupId = GetAllCollectionIdL();
hgs
parents: 89
diff changeset
   844
    iCaStorageProxy.OrganizeL( entryIds, organizeParams );
hgs
parents: 89
diff changeset
   845
    CleanupStack::PopAndDestroy( &entryIds );
hgs
parents: 89
diff changeset
   846
    }
hgs
parents: 89
diff changeset
   847
hgs
parents: 89
diff changeset
   848
hgs
parents: 89
diff changeset
   849
hgs
parents: 89
diff changeset
   850
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   851
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   852
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   853
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   854
void CCaSrvAppScanner::RemoveEntryFromDownloadedL( TInt aEntryId )
7feec50967db 201003_02
hgs
parents:
diff changeset
   855
    {
94
hgs
parents: 93
diff changeset
   856
    TCaOperationParams params;
hgs
parents: 93
diff changeset
   857
    params.iOperationType = TCaOperationParams::ERemove;
hgs
parents: 93
diff changeset
   858
    params.iGroupId = GetCollectionDownloadIdL();
hgs
parents: 93
diff changeset
   859
    params.iBeforeEntryId = 0; // Not Used
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   860
7feec50967db 201003_02
hgs
parents:
diff changeset
   861
    RArray<TInt> entryIds;
7feec50967db 201003_02
hgs
parents:
diff changeset
   862
    CleanupClosePushL( entryIds );
7feec50967db 201003_02
hgs
parents:
diff changeset
   863
    entryIds.AppendL( aEntryId );
7feec50967db 201003_02
hgs
parents:
diff changeset
   864
    iCaStorageProxy.OrganizeL( entryIds, params );
7feec50967db 201003_02
hgs
parents:
diff changeset
   865
7feec50967db 201003_02
hgs
parents:
diff changeset
   866
    CleanupStack::PopAndDestroy( &entryIds );
7feec50967db 201003_02
hgs
parents:
diff changeset
   867
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   868
7feec50967db 201003_02
hgs
parents:
diff changeset
   869
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   870
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   871
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   872
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   873
void CCaSrvAppScanner::ScheduleScan()
7feec50967db 201003_02
hgs
parents:
diff changeset
   874
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   875
    if( !IsActive() )
7feec50967db 201003_02
hgs
parents:
diff changeset
   876
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   877
        TRequestStatus* ownStatus = &iStatus;
7feec50967db 201003_02
hgs
parents:
diff changeset
   878
        *ownStatus = KRequestPending;
7feec50967db 201003_02
hgs
parents:
diff changeset
   879
        SetActive();
7feec50967db 201003_02
hgs
parents:
diff changeset
   880
        User::RequestComplete( ownStatus, KErrNone );
7feec50967db 201003_02
hgs
parents:
diff changeset
   881
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
   882
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   883
7feec50967db 201003_02
hgs
parents:
diff changeset
   884
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   885
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   886
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   887
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   888
void CCaSrvAppScanner::AddAppEntryL( TUint aUid, TUint aCurrentMmcId )
7feec50967db 201003_02
hgs
parents:
diff changeset
   889
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   890
    // Now add the app entry.
7feec50967db 201003_02
hgs
parents:
diff changeset
   891
    CCaInnerEntry* appEntry = CCaInnerEntry::NewLC();
7feec50967db 201003_02
hgs
parents:
diff changeset
   892
7feec50967db 201003_02
hgs
parents:
diff changeset
   893
    appEntry->SetEntryTypeNameL( KCaTypeApp );
7feec50967db 201003_02
hgs
parents:
diff changeset
   894
    appEntry->SetUid( aUid );
7feec50967db 201003_02
hgs
parents:
diff changeset
   895
    appEntry->SetFlags( EVisible );
7feec50967db 201003_02
hgs
parents:
diff changeset
   896
    appEntry->SetRole( EItemEntryRole );
7feec50967db 201003_02
hgs
parents:
diff changeset
   897
7feec50967db 201003_02
hgs
parents:
diff changeset
   898
    SetApaAppInfoL( appEntry );
94
hgs
parents: 93
diff changeset
   899
    HandleRemovableVisibleFlagsUpdateL( appEntry );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   900
    HandleMmcAttrUpdateL( appEntry, aCurrentMmcId );
7feec50967db 201003_02
hgs
parents:
diff changeset
   901
7feec50967db 201003_02
hgs
parents:
diff changeset
   902
    iCaStorageProxy.AddL( appEntry );
93
hgs
parents: 92
diff changeset
   903
92
hgs
parents: 89
diff changeset
   904
    AddEntryToPredefinedCollectionL( appEntry );
93
hgs
parents: 92
diff changeset
   905
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   906
    if( iInstalledPackages.Find( aUid ) != KErrNotFound )
7feec50967db 201003_02
hgs
parents:
diff changeset
   907
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   908
        AddEntryToDownloadedCollectionL( appEntry->GetId() );
94
hgs
parents: 93
diff changeset
   909
        RemoveFromInstalledPackages( aUid );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   910
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
   911
7feec50967db 201003_02
hgs
parents:
diff changeset
   912
    CleanupStack::PopAndDestroy( appEntry );
7feec50967db 201003_02
hgs
parents:
diff changeset
   913
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   914
7feec50967db 201003_02
hgs
parents:
diff changeset
   915
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
   916
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   917
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   918
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   919
void CCaSrvAppScanner::RemoveFromInstalledPackages( TUint aUid )
7feec50967db 201003_02
hgs
parents:
diff changeset
   920
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   921
    TInt appIndex = iInstalledPackages.Find( aUid );
7feec50967db 201003_02
hgs
parents:
diff changeset
   922
    if( appIndex != KErrNotFound )
7feec50967db 201003_02
hgs
parents:
diff changeset
   923
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   924
        iInstalledPackages.Remove( appIndex );
7feec50967db 201003_02
hgs
parents:
diff changeset
   925
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
   926
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   927
7feec50967db 201003_02
hgs
parents:
diff changeset
   928
// ---------------------------------------------------------------------------
94
hgs
parents: 93
diff changeset
   929
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   930
// ---------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   931
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   932
TBool CCaSrvAppScanner::SetApaAppInfoL( CCaInnerEntry* aEntry )
7feec50967db 201003_02
hgs
parents:
diff changeset
   933
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   934
    TBool changed( EFalse );
94
hgs
parents: 93
diff changeset
   935
    TApaAppInfo* info = new ( ELeave ) TApaAppInfo();
hgs
parents: 93
diff changeset
   936
    CleanupStack::PushL(info);
hgs
parents: 93
diff changeset
   937
    if( KErrNone == iSrvEngUtils.GetAppInfo( *aEntry, *info ) )
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   938
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   939
        RBuf attrVal;
7feec50967db 201003_02
hgs
parents:
diff changeset
   940
        attrVal.CleanupClosePushL();
7feec50967db 201003_02
hgs
parents:
diff changeset
   941
        attrVal.CreateL( KCaMaxAttrValueLen );
98
hgs
parents: 96
diff changeset
   942
        aEntry->FindAttribute( KCaAttrShortName, attrVal );
hgs
parents: 96
diff changeset
   943
        if( attrVal.Compare( info->iShortCaption ) != KErrNone
94
hgs
parents: 93
diff changeset
   944
                || aEntry->GetText().Compare( info->iCaption )
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   945
                        != KErrNone )
7feec50967db 201003_02
hgs
parents:
diff changeset
   946
            {
94
hgs
parents: 93
diff changeset
   947
            aEntry->SetTextL( info->iCaption );
98
hgs
parents: 96
diff changeset
   948
            aEntry->AddAttributeL( KCaAttrShortName, info->iShortCaption );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   949
            changed = ETrue;
7feec50967db 201003_02
hgs
parents:
diff changeset
   950
            }
94
hgs
parents: 93
diff changeset
   951
        
hgs
parents: 93
diff changeset
   952
        
96
hgs
parents: 94
diff changeset
   953
        if ( UpdateComponentIdL( *aEntry ) )
94
hgs
parents: 93
diff changeset
   954
            {
hgs
parents: 93
diff changeset
   955
            changed = ETrue;
hgs
parents: 93
diff changeset
   956
            }
hgs
parents: 93
diff changeset
   957
        
85
7feec50967db 201003_02
hgs
parents:
diff changeset
   958
        CleanupStack::PopAndDestroy( &attrVal );
94
hgs
parents: 93
diff changeset
   959
        
hgs
parents: 93
diff changeset
   960
        // check if its java app and add attr for entries
92
hgs
parents: 89
diff changeset
   961
        TUid appTypeUid;
94
hgs
parents: 93
diff changeset
   962
        if( KErrNone == iApaLsSession.GetAppType( appTypeUid, info->iUid ) )
92
hgs
parents: 89
diff changeset
   963
            {
hgs
parents: 89
diff changeset
   964
            if( appTypeUid == KMidletApplicationTypeUid )
hgs
parents: 89
diff changeset
   965
                {
94
hgs
parents: 93
diff changeset
   966
                aEntry->AddAttributeL(
hgs
parents: 93
diff changeset
   967
                        KCaAttrAppType,
hgs
parents: 93
diff changeset
   968
                        KCaAttrAppTypeValueJava );
98
hgs
parents: 96
diff changeset
   969
                
hgs
parents: 96
diff changeset
   970
                TComponentId compId = 
hgs
parents: 96
diff changeset
   971
                        iSoftwareRegistry.GetComponentIdForAppL( info->iUid );
hgs
parents: 96
diff changeset
   972
                CPropertyEntry* propertyEntry = 
hgs
parents: 96
diff changeset
   973
                    iSoftwareRegistry.GetComponentPropertyL( compId, KCaScrPropertyAppSettings );
hgs
parents: 96
diff changeset
   974
                CleanupStack::PushL( propertyEntry );
hgs
parents: 96
diff changeset
   975
                if ( propertyEntry && 
hgs
parents: 96
diff changeset
   976
                        propertyEntry->PropertyType() == CPropertyEntry::ELocalizedProperty ) 
hgs
parents: 96
diff changeset
   977
                    {
hgs
parents: 96
diff changeset
   978
                    aEntry->AddAttributeL(
hgs
parents: 96
diff changeset
   979
                            KCaAttrAppSettingsPlugin,
hgs
parents: 96
diff changeset
   980
                            static_cast<CLocalizablePropertyEntry*>(propertyEntry)->StrValue() );
hgs
parents: 96
diff changeset
   981
                    }
hgs
parents: 96
diff changeset
   982
                CleanupStack::PopAndDestroy( propertyEntry );
92
hgs
parents: 89
diff changeset
   983
                }
96
hgs
parents: 94
diff changeset
   984
            else if ( appTypeUid == KCWRTApplicationTypeUid )
92
hgs
parents: 89
diff changeset
   985
                {
94
hgs
parents: 93
diff changeset
   986
                aEntry->AddAttributeL(
hgs
parents: 93
diff changeset
   987
                        KCaAttrAppType,
hgs
parents: 93
diff changeset
   988
                        KCaAttrAppTypeValueCWRT );
96
hgs
parents: 94
diff changeset
   989
                TComponentId compId = 
hgs
parents: 94
diff changeset
   990
                        iSoftwareRegistry.GetComponentIdForAppL( info->iUid );
hgs
parents: 94
diff changeset
   991
                CPropertyEntry* isMiniview = 
hgs
parents: 94
diff changeset
   992
                                        iSoftwareRegistry.GetComponentPropertyL( compId,
hgs
parents: 94
diff changeset
   993
                                                KCaScrPropertyIsMiniviewSupported );
hgs
parents: 94
diff changeset
   994
                CleanupStack::PushL( isMiniview );
hgs
parents: 94
diff changeset
   995
                // check first if we support mini view
hgs
parents: 94
diff changeset
   996
                if (isMiniview && isMiniview->PropertyType() == CPropertyEntry::EIntProperty &&
hgs
parents: 94
diff changeset
   997
                        static_cast<CIntPropertyEntry*>(isMiniview)->IntValue())
hgs
parents: 94
diff changeset
   998
                    {
hgs
parents: 94
diff changeset
   999
                    CPropertyEntry* appId = 
hgs
parents: 94
diff changeset
  1000
                        iSoftwareRegistry.GetComponentPropertyL( compId, KCaScrPropertyAppId );
hgs
parents: 94
diff changeset
  1001
                    CleanupStack::PushL( appId );
hgs
parents: 94
diff changeset
  1002
                    if ( appId && 
hgs
parents: 94
diff changeset
  1003
                         appId->PropertyType() == CPropertyEntry::ELocalizedProperty ) 
hgs
parents: 94
diff changeset
  1004
                        {
hgs
parents: 94
diff changeset
  1005
                        aEntry->AddAttributeL(
hgs
parents: 94
diff changeset
  1006
                                            KCaAttrAppWidgetUri,
hgs
parents: 94
diff changeset
  1007
                                            KCaAttrAppWidgetUriCWRTValue );
hgs
parents: 94
diff changeset
  1008
                        aEntry->AddAttributeL(
hgs
parents: 94
diff changeset
  1009
                                            KCaAttrAppWidgetParamWebAppId,
hgs
parents: 94
diff changeset
  1010
                                            static_cast<CLocalizablePropertyEntry*>(appId)->StrValue() );
hgs
parents: 94
diff changeset
  1011
                        }
hgs
parents: 94
diff changeset
  1012
                    CleanupStack::PopAndDestroy( appId );
hgs
parents: 94
diff changeset
  1013
                    }                
hgs
parents: 94
diff changeset
  1014
                CleanupStack::PopAndDestroy( isMiniview );
92
hgs
parents: 89
diff changeset
  1015
                }
hgs
parents: 89
diff changeset
  1016
            }
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1017
        }
94
hgs
parents: 93
diff changeset
  1018
    CleanupStack::PopAndDestroy( info );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1019
    return changed;
7feec50967db 201003_02
hgs
parents:
diff changeset
  1020
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1021
7feec50967db 201003_02
hgs
parents:
diff changeset
  1022
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
  1023
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1024
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
  1025
//
7feec50967db 201003_02
hgs
parents:
diff changeset
  1026
void CCaSrvAppScanner::HandleMissingItemsL(
7feec50967db 201003_02
hgs
parents:
diff changeset
  1027
        RPointerArray<CCaInnerEntry>& aCaEntries )
7feec50967db 201003_02
hgs
parents:
diff changeset
  1028
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
  1029
    for( TInt i = 0; i < aCaEntries.Count(); i++ )
7feec50967db 201003_02
hgs
parents:
diff changeset
  1030
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
  1031
        RBuf attrVal;
7feec50967db 201003_02
hgs
parents:
diff changeset
  1032
        attrVal.CleanupClosePushL();
7feec50967db 201003_02
hgs
parents:
diff changeset
  1033
        attrVal.CreateL( KCaMaxAttrValueLen );
7feec50967db 201003_02
hgs
parents:
diff changeset
  1034
        if( aCaEntries[i]->FindAttribute( KCaAttrMmcId(), attrVal ) )
7feec50967db 201003_02
hgs
parents:
diff changeset
  1035
            {
93
hgs
parents: 92
diff changeset
  1036
            TUint mmcId = 0;
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1037
            MenuUtils::GetTUint( attrVal, mmcId );
93
hgs
parents: 92
diff changeset
  1038
            if( ( mmcId && KErrNotFound != iMmcHistory->Find( mmcId )
98
hgs
parents: 96
diff changeset
  1039
                        && mmcId != CurrentMmcId() ) 
hgs
parents: 96
diff changeset
  1040
                    || ( attrVal == KCaMassStorage() 
hgs
parents: 96
diff changeset
  1041
                        && IsDriveInUse( DriveInfo::EDefaultMassStorage ) ) )
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1042
                {
93
hgs
parents: 92
diff changeset
  1043
                // This item is on an MMC which is currently
hgs
parents: 92
diff changeset
  1044
                // in the MMC history or on a mass storage in use.
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1045
                // Set it "missing" but keep it.
93
hgs
parents: 92
diff changeset
  1046
                SetMissingFlagL( aCaEntries[i] );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1047
                }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1048
            else
7feec50967db 201003_02
hgs
parents:
diff changeset
  1049
                {
98
hgs
parents: 96
diff changeset
  1050
                aCaEntries[i]->RemoveAttributeL( KCaAttrMmcId() );
93
hgs
parents: 92
diff changeset
  1051
                ClearVisibleFlagL( aCaEntries[i] );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1052
                }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1053
            }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1054
        else
7feec50967db 201003_02
hgs
parents:
diff changeset
  1055
            {
93
hgs
parents: 92
diff changeset
  1056
            ClearVisibleFlagL( aCaEntries[i] );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1057
            }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1058
        CleanupStack::PopAndDestroy( &attrVal );
7feec50967db 201003_02
hgs
parents:
diff changeset
  1059
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1060
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1061
7feec50967db 201003_02
hgs
parents:
diff changeset
  1062
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
  1063
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1064
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
  1065
//
93
hgs
parents: 92
diff changeset
  1066
void CCaSrvAppScanner::SetMissingFlagL( CCaInnerEntry* aEntry )
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1067
    {
93
hgs
parents: 92
diff changeset
  1068
    if( !( aEntry->GetFlags() & EMissing ) )
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1069
        {
98
hgs
parents: 96
diff changeset
  1070
        aEntry->SetFlags( ( aEntry->GetFlags() | EMissing ) & ~EUninstall );
93
hgs
parents: 92
diff changeset
  1071
        iCaStorageProxy.AddL( aEntry, EFalse, EItemDisappeared );
hgs
parents: 92
diff changeset
  1072
        }
hgs
parents: 92
diff changeset
  1073
    }
hgs
parents: 92
diff changeset
  1074
hgs
parents: 92
diff changeset
  1075
// ---------------------------------------------------------
hgs
parents: 92
diff changeset
  1076
//
hgs
parents: 92
diff changeset
  1077
// ---------------------------------------------------------
hgs
parents: 92
diff changeset
  1078
//
hgs
parents: 92
diff changeset
  1079
void CCaSrvAppScanner::ClearVisibleFlagL( CCaInnerEntry* aEntry )
hgs
parents: 92
diff changeset
  1080
    {
hgs
parents: 92
diff changeset
  1081
    if( aEntry->GetFlags() & EVisible )
hgs
parents: 92
diff changeset
  1082
        {
94
hgs
parents: 93
diff changeset
  1083
        aEntry->SetFlags(
hgs
parents: 93
diff changeset
  1084
                aEntry->GetFlags() &
98
hgs
parents: 96
diff changeset
  1085
                ~EUninstall &
94
hgs
parents: 93
diff changeset
  1086
                ~EVisible &
hgs
parents: 93
diff changeset
  1087
                ~EMissing &
hgs
parents: 93
diff changeset
  1088
                ~EUsed );
93
hgs
parents: 92
diff changeset
  1089
        iCaStorageProxy.AddL( aEntry, EFalse, EItemDisappeared );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1090
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1091
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1092
7feec50967db 201003_02
hgs
parents:
diff changeset
  1093
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
  1094
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1095
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
  1096
//
7feec50967db 201003_02
hgs
parents:
diff changeset
  1097
TUint CCaSrvAppScanner::UpdateMmcHistoryL()
7feec50967db 201003_02
hgs
parents:
diff changeset
  1098
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
  1099
    TUint mmcId = CurrentMmcId();
7feec50967db 201003_02
hgs
parents:
diff changeset
  1100
    if( mmcId )
7feec50967db 201003_02
hgs
parents:
diff changeset
  1101
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
  1102
        iMmcHistory->InsertL( mmcId );
7feec50967db 201003_02
hgs
parents:
diff changeset
  1103
        iMmcHistory->SaveL( iFs, KCaMmcHistoryFname() );
7feec50967db 201003_02
hgs
parents:
diff changeset
  1104
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1105
    return mmcId;
7feec50967db 201003_02
hgs
parents:
diff changeset
  1106
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1107
7feec50967db 201003_02
hgs
parents:
diff changeset
  1108
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
  1109
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1110
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
  1111
//
7feec50967db 201003_02
hgs
parents:
diff changeset
  1112
TUint CCaSrvAppScanner::CurrentMmcId() const
7feec50967db 201003_02
hgs
parents:
diff changeset
  1113
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
  1114
    // Get mmc id. Errors are ignored.
7feec50967db 201003_02
hgs
parents:
diff changeset
  1115
    TUint mmcId = 0;
7feec50967db 201003_02
hgs
parents:
diff changeset
  1116
    TInt mmcDrive;
94
hgs
parents: 93
diff changeset
  1117
    TInt err = DriveInfo::GetDefaultDrive(
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1118
            DriveInfo::EDefaultRemovableMassStorage, mmcDrive );
7feec50967db 201003_02
hgs
parents:
diff changeset
  1119
    if( !err )
7feec50967db 201003_02
hgs
parents:
diff changeset
  1120
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
  1121
        TVolumeInfo volumeInfo;
7feec50967db 201003_02
hgs
parents:
diff changeset
  1122
        err = iFs.Volume( volumeInfo, mmcDrive );
7feec50967db 201003_02
hgs
parents:
diff changeset
  1123
        if( !err )
7feec50967db 201003_02
hgs
parents:
diff changeset
  1124
            {
7feec50967db 201003_02
hgs
parents:
diff changeset
  1125
            mmcId = volumeInfo.iUniqueID;
7feec50967db 201003_02
hgs
parents:
diff changeset
  1126
            }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1127
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1128
    return mmcId;
7feec50967db 201003_02
hgs
parents:
diff changeset
  1129
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1130
7feec50967db 201003_02
hgs
parents:
diff changeset
  1131
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
  1132
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1133
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
  1134
//
7feec50967db 201003_02
hgs
parents:
diff changeset
  1135
TBool CCaSrvAppScanner::IsFileInDrive(
94
hgs
parents: 93
diff changeset
  1136
    const TDesC& aFileName,
hgs
parents: 93
diff changeset
  1137
    const DriveInfo::TDefaultDrives& aDefaultDrive ) const
hgs
parents: 93
diff changeset
  1138
    {
hgs
parents: 93
diff changeset
  1139
    TBool retVal( EFalse );
hgs
parents: 93
diff changeset
  1140
    if ( aFileName.Length()>0 )
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1141
        {
94
hgs
parents: 93
diff changeset
  1142
        TInt mmcDrive;
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1143
        TInt err = DriveInfo::GetDefaultDrive( aDefaultDrive, mmcDrive );
7feec50967db 201003_02
hgs
parents:
diff changeset
  1144
        if( !err )
7feec50967db 201003_02
hgs
parents:
diff changeset
  1145
            {
7feec50967db 201003_02
hgs
parents:
diff changeset
  1146
            TInt fileDrive;
7feec50967db 201003_02
hgs
parents:
diff changeset
  1147
            err = RFs::CharToDrive( aFileName[0], fileDrive );
7feec50967db 201003_02
hgs
parents:
diff changeset
  1148
            if( !err && fileDrive == mmcDrive )
7feec50967db 201003_02
hgs
parents:
diff changeset
  1149
                {
94
hgs
parents: 93
diff changeset
  1150
                retVal = ETrue;
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1151
                }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1152
            }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1153
        }
94
hgs
parents: 93
diff changeset
  1154
    return retVal;
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1155
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1156
7feec50967db 201003_02
hgs
parents:
diff changeset
  1157
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
  1158
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1159
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
  1160
//
92
hgs
parents: 89
diff changeset
  1161
TBool CCaSrvAppScanner::IsAppInDriveL(
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1162
        const TUid aUid,
7feec50967db 201003_02
hgs
parents:
diff changeset
  1163
        const DriveInfo::TDefaultDrives& aDefaultDrive ) const
7feec50967db 201003_02
hgs
parents:
diff changeset
  1164
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
  1165
    TBool ret( EFalse );
94
hgs
parents: 93
diff changeset
  1166
    TApaAppInfo* appInfo = new ( ELeave ) TApaAppInfo();
92
hgs
parents: 89
diff changeset
  1167
    TInt err = iApaLsSession.GetAppInfo( *appInfo, aUid );
hgs
parents: 89
diff changeset
  1168
    if( !err && IsFileInDrive( appInfo->iFullName, aDefaultDrive ) )
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1169
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
  1170
        ret = ETrue;
7feec50967db 201003_02
hgs
parents:
diff changeset
  1171
        }
92
hgs
parents: 89
diff changeset
  1172
    delete appInfo;
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1173
    return ret;
7feec50967db 201003_02
hgs
parents:
diff changeset
  1174
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1175
7feec50967db 201003_02
hgs
parents:
diff changeset
  1176
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
  1177
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1178
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
  1179
//
92
hgs
parents: 89
diff changeset
  1180
TBool CCaSrvAppScanner::IsInMmcL( const TUid aUid ) const
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1181
    {
92
hgs
parents: 89
diff changeset
  1182
    return IsAppInDriveL( aUid, DriveInfo::EDefaultRemovableMassStorage );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1183
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1184
7feec50967db 201003_02
hgs
parents:
diff changeset
  1185
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
  1186
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1187
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
  1188
//
92
hgs
parents: 89
diff changeset
  1189
TBool CCaSrvAppScanner::IsInMassStorageL( const TUid aUid ) const
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1190
    {
92
hgs
parents: 89
diff changeset
  1191
    return IsAppInDriveL( aUid, DriveInfo::EDefaultMassStorage );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1192
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1193
7feec50967db 201003_02
hgs
parents:
diff changeset
  1194
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
  1195
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1196
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
  1197
//
92
hgs
parents: 89
diff changeset
  1198
TBool CCaSrvAppScanner::IsInRomL( TInt aUid )
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1199
    {
92
hgs
parents: 89
diff changeset
  1200
    return IsAppInDriveL( TUid::Uid( aUid ), DriveInfo::EDefaultRom );
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1201
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1202
7feec50967db 201003_02
hgs
parents:
diff changeset
  1203
// ---------------------------------------------------------
94
hgs
parents: 93
diff changeset
  1204
//
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1205
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
  1206
//
7feec50967db 201003_02
hgs
parents:
diff changeset
  1207
TBool CCaSrvAppScanner::IsDriveInUse(
7feec50967db 201003_02
hgs
parents:
diff changeset
  1208
        const DriveInfo::TDefaultDrives& aDefaultDrive )
7feec50967db 201003_02
hgs
parents:
diff changeset
  1209
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
  1210
    TBool inUse( EFalse );
7feec50967db 201003_02
hgs
parents:
diff changeset
  1211
    TInt drive;
7feec50967db 201003_02
hgs
parents:
diff changeset
  1212
7feec50967db 201003_02
hgs
parents:
diff changeset
  1213
    TInt err = DriveInfo::GetDefaultDrive( aDefaultDrive, drive );
7feec50967db 201003_02
hgs
parents:
diff changeset
  1214
    if( err == KErrNone )
7feec50967db 201003_02
hgs
parents:
diff changeset
  1215
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
  1216
        TUint status;
7feec50967db 201003_02
hgs
parents:
diff changeset
  1217
        err = DriveInfo::GetDriveStatus( iFs, drive, status );
7feec50967db 201003_02
hgs
parents:
diff changeset
  1218
        if( err == KErrNone && ( status & DriveInfo::EDriveInUse ) )
7feec50967db 201003_02
hgs
parents:
diff changeset
  1219
            {
7feec50967db 201003_02
hgs
parents:
diff changeset
  1220
            inUse = ETrue;
7feec50967db 201003_02
hgs
parents:
diff changeset
  1221
            }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1222
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1223
7feec50967db 201003_02
hgs
parents:
diff changeset
  1224
    return inUse;
7feec50967db 201003_02
hgs
parents:
diff changeset
  1225
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
  1226
94
hgs
parents: 93
diff changeset
  1227
// ---------------------------------------------------------
hgs
parents: 93
diff changeset
  1228
//
hgs
parents: 93
diff changeset
  1229
// ---------------------------------------------------------
hgs
parents: 93
diff changeset
  1230
//
92
hgs
parents: 89
diff changeset
  1231
void CCaSrvAppScanner::MakeNotEmptyCollectionsVisibleL()
hgs
parents: 89
diff changeset
  1232
    {
hgs
parents: 89
diff changeset
  1233
    RPointerArray<CCaInnerEntry> resultArray;
hgs
parents: 89
diff changeset
  1234
    CleanupResetAndDestroyPushL( resultArray );
hgs
parents: 89
diff changeset
  1235
    CCaInnerQuery* hiddenCollectionsQuery = CCaInnerQuery::NewLC();
hgs
parents: 89
diff changeset
  1236
    CDesC16ArrayFlat* entryType = new ( ELeave ) CDesC16ArrayFlat(
hgs
parents: 89
diff changeset
  1237
            KGranularityOne );
hgs
parents: 89
diff changeset
  1238
    CleanupStack::PushL( entryType );
hgs
parents: 89
diff changeset
  1239
    entryType->AppendL( KCaTypeCollection );
hgs
parents: 89
diff changeset
  1240
    hiddenCollectionsQuery->SetEntryTypeNames( entryType );
hgs
parents: 89
diff changeset
  1241
    hiddenCollectionsQuery->SetFlagsOff( EVisible );
hgs
parents: 89
diff changeset
  1242
    iCaStorageProxy.GetEntriesL( hiddenCollectionsQuery, resultArray );
hgs
parents: 89
diff changeset
  1243
    CleanupStack::Pop( entryType );
hgs
parents: 89
diff changeset
  1244
    CleanupStack::PopAndDestroy( hiddenCollectionsQuery );
hgs
parents: 89
diff changeset
  1245
    if( resultArray.Count() )
hgs
parents: 89
diff changeset
  1246
        {
hgs
parents: 89
diff changeset
  1247
        for( TInt i=0; i<resultArray.Count(); i++ )
hgs
parents: 89
diff changeset
  1248
            {
hgs
parents: 89
diff changeset
  1249
            // for any not visible collection
hgs
parents: 89
diff changeset
  1250
            MakeCollectionVisibleIfHasVisibleEntryL( resultArray[i] );
hgs
parents: 89
diff changeset
  1251
            }
hgs
parents: 89
diff changeset
  1252
        }
hgs
parents: 89
diff changeset
  1253
    CleanupStack::PopAndDestroy( &resultArray );
hgs
parents: 89
diff changeset
  1254
   }
hgs
parents: 89
diff changeset
  1255
94
hgs
parents: 93
diff changeset
  1256
// ---------------------------------------------------------
hgs
parents: 93
diff changeset
  1257
//
hgs
parents: 93
diff changeset
  1258
// ---------------------------------------------------------
hgs
parents: 93
diff changeset
  1259
//
92
hgs
parents: 89
diff changeset
  1260
void CCaSrvAppScanner::MakeCollectionVisibleIfHasVisibleEntryL(
hgs
parents: 89
diff changeset
  1261
        CCaInnerEntry* aEntry )
hgs
parents: 89
diff changeset
  1262
    {
hgs
parents: 89
diff changeset
  1263
    RPointerArray<CCaInnerEntry> resultEntriesArray;
hgs
parents: 89
diff changeset
  1264
    CleanupResetAndDestroyPushL( resultEntriesArray );
hgs
parents: 89
diff changeset
  1265
    CCaInnerQuery* visibleEntriesQuery = CCaInnerQuery::NewLC();
hgs
parents: 89
diff changeset
  1266
    visibleEntriesQuery->SetParentId( aEntry->GetId() );
hgs
parents: 89
diff changeset
  1267
    visibleEntriesQuery->SetFlagsOn( EVisible );
hgs
parents: 89
diff changeset
  1268
    visibleEntriesQuery->SetFlagsOff( EMissing );
hgs
parents: 89
diff changeset
  1269
    iCaStorageProxy.GetEntriesL( visibleEntriesQuery, resultEntriesArray );
hgs
parents: 89
diff changeset
  1270
    if( resultEntriesArray.Count() )
hgs
parents: 89
diff changeset
  1271
        {
hgs
parents: 89
diff changeset
  1272
        // set collection visible if hidden
93
hgs
parents: 92
diff changeset
  1273
        if( HandleVisibleFlagUpdate( aEntry ) )
92
hgs
parents: 89
diff changeset
  1274
            {
hgs
parents: 89
diff changeset
  1275
            // update here this collection
93
hgs
parents: 92
diff changeset
  1276
            iCaStorageProxy.AddL( aEntry );
92
hgs
parents: 89
diff changeset
  1277
            }
hgs
parents: 89
diff changeset
  1278
        }
hgs
parents: 89
diff changeset
  1279
    CleanupStack::PopAndDestroy( visibleEntriesQuery );
hgs
parents: 89
diff changeset
  1280
    CleanupStack::PopAndDestroy( &resultEntriesArray );
hgs
parents: 89
diff changeset
  1281
    }
hgs
parents: 89
diff changeset
  1282
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1283
// ---------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
  1284
//
94
hgs
parents: 93
diff changeset
  1285
// ---------------------------------------------------------//
96
hgs
parents: 94
diff changeset
  1286
TBool CCaSrvAppScanner::UpdateComponentIdL( CCaInnerEntry& aEntry ) const
85
7feec50967db 201003_02
hgs
parents:
diff changeset
  1287
    {
94
hgs
parents: 93
diff changeset
  1288
    TBool updated( EFalse );
hgs
parents: 93
diff changeset
  1289
    
96
hgs
parents: 94
diff changeset
  1290
    TUid uid;
hgs
parents: 94
diff changeset
  1291
    TInt err(KErrNone);
hgs
parents: 94
diff changeset
  1292
    TComponentId componentId( 0 );
hgs
parents: 94
diff changeset
  1293
    TRAP(err, componentId = 
hgs
parents: 94
diff changeset
  1294
            iSoftwareRegistry.GetComponentIdForAppL(
hgs
parents: 94
diff changeset
  1295
            uid.Uid( aEntry.GetUid() ) ) )
94
hgs
parents: 93
diff changeset
  1296
    
96
hgs
parents: 94
diff changeset
  1297
    if ( componentId > 0 && err == KErrNone )
94
hgs
parents: 93
diff changeset
  1298
        {
hgs
parents: 93
diff changeset
  1299
        RBuf newComponentId;
hgs
parents: 93
diff changeset
  1300
        newComponentId.CleanupClosePushL();
hgs
parents: 93
diff changeset
  1301
        newComponentId.CreateL( sizeof(TComponentId) + 1 );
96
hgs
parents: 94
diff changeset
  1302
        newComponentId.AppendNum( componentId );
94
hgs
parents: 93
diff changeset
  1303
        
hgs
parents: 93
diff changeset
  1304
        RBuf oldComponentId;
hgs
parents: 93
diff changeset
  1305
        oldComponentId.CleanupClosePushL();
hgs
parents: 93
diff changeset
  1306
        oldComponentId.CreateL( KCaMaxAttrValueLen );
hgs
parents: 93
diff changeset
  1307
        
hgs
parents: 93
diff changeset
  1308
        const TBool componentIdAttributeFound = 
hgs
parents: 93
diff changeset
  1309
            aEntry.FindAttribute( KCaComponentId, oldComponentId );
hgs
parents: 93
diff changeset
  1310
              
hgs
parents: 93
diff changeset
  1311
        if ( !componentIdAttributeFound 
hgs
parents: 93
diff changeset
  1312
            || oldComponentId.Compare( newComponentId ) != 0 )
hgs
parents: 93
diff changeset
  1313
            {
hgs
parents: 93
diff changeset
  1314
            // 'add' or 'update' the component id attribute value
hgs
parents: 93
diff changeset
  1315
            aEntry.AddAttributeL( KCaComponentId, 
hgs
parents: 93
diff changeset
  1316
                newComponentId );
hgs
parents: 93
diff changeset
  1317
            
hgs
parents: 93
diff changeset
  1318
            updated = ETrue;
hgs
parents: 93
diff changeset
  1319
            }
hgs
parents: 93
diff changeset
  1320
        
hgs
parents: 93
diff changeset
  1321
        CleanupStack::PopAndDestroy( &oldComponentId );
hgs
parents: 93
diff changeset
  1322
        CleanupStack::PopAndDestroy( &newComponentId );
hgs
parents: 93
diff changeset
  1323
        }
hgs
parents: 93
diff changeset
  1324
    return updated;
hgs
parents: 93
diff changeset
  1325
    }