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