contentstorage/handlersrc/cauninstalloperation.cpp
author hgs
Tue, 23 Mar 2010 23:28:12 +0200
changeset 86 e492551a0d54
parent 85 7feec50967db
permissions -rw-r--r--
201005
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) 2008 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:  ?Description
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 <apgcli.h>
7feec50967db 201003_02
hgs
parents:
diff changeset
    19
#include <swi/sisregistrysession.h>
7feec50967db 201003_02
hgs
parents:
diff changeset
    20
#include <swi/sisregistryentry.h>
7feec50967db 201003_02
hgs
parents:
diff changeset
    21
#include "cautils.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    22
#include "cadef.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    23
#include "cainnerentry.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    24
#include "cauninstalloperation.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    25
_LIT8( KAppMimeType, "x-epoc/x-sisx-app" );
7feec50967db 201003_02
hgs
parents:
diff changeset
    26
7feec50967db 201003_02
hgs
parents:
diff changeset
    27
// ================= MEMBER FUNCTIONS =======================
7feec50967db 201003_02
hgs
parents:
diff changeset
    28
7feec50967db 201003_02
hgs
parents:
diff changeset
    29
// ---------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    30
// CCaUninstallOperation::~CCaUninstallOperation
7feec50967db 201003_02
hgs
parents:
diff changeset
    31
// ---------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    32
//
7feec50967db 201003_02
hgs
parents:
diff changeset
    33
CCaUninstallOperation::~CCaUninstallOperation()
7feec50967db 201003_02
hgs
parents:
diff changeset
    34
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
    35
    Cancel();
7feec50967db 201003_02
hgs
parents:
diff changeset
    36
    iUninstaller.Close();
7feec50967db 201003_02
hgs
parents:
diff changeset
    37
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
    38
7feec50967db 201003_02
hgs
parents:
diff changeset
    39
// ---------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    40
// CCaUninstallOperation::NewL
7feec50967db 201003_02
hgs
parents:
diff changeset
    41
// ---------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    42
//
7feec50967db 201003_02
hgs
parents:
diff changeset
    43
CCaUninstallOperation* CCaUninstallOperation::NewL( CCaInnerEntry &aEntry,
7feec50967db 201003_02
hgs
parents:
diff changeset
    44
        TInt aPriority )
7feec50967db 201003_02
hgs
parents:
diff changeset
    45
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
    46
    CCaUninstallOperation* self;
7feec50967db 201003_02
hgs
parents:
diff changeset
    47
7feec50967db 201003_02
hgs
parents:
diff changeset
    48
    self = new ( ELeave ) CCaUninstallOperation( aEntry, aPriority );
7feec50967db 201003_02
hgs
parents:
diff changeset
    49
    CleanupStack::PushL( self );
7feec50967db 201003_02
hgs
parents:
diff changeset
    50
    self->ConstructL( aEntry );
7feec50967db 201003_02
hgs
parents:
diff changeset
    51
    CleanupStack::Pop( self );
7feec50967db 201003_02
hgs
parents:
diff changeset
    52
    return self;
7feec50967db 201003_02
hgs
parents:
diff changeset
    53
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
    54
7feec50967db 201003_02
hgs
parents:
diff changeset
    55
// ---------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    56
// CCaUninstallOperation::CCaUninstallOperation
7feec50967db 201003_02
hgs
parents:
diff changeset
    57
// ---------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    58
//
7feec50967db 201003_02
hgs
parents:
diff changeset
    59
CCaUninstallOperation::CCaUninstallOperation( CCaInnerEntry& aEntry,
7feec50967db 201003_02
hgs
parents:
diff changeset
    60
        TInt aPriority ) :
7feec50967db 201003_02
hgs
parents:
diff changeset
    61
    CActive( aPriority ), iEntry( aEntry ), iUninstaller(), iId( 0 )
7feec50967db 201003_02
hgs
parents:
diff changeset
    62
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
    63
    CActiveScheduler::Add( this );
7feec50967db 201003_02
hgs
parents:
diff changeset
    64
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
    65
7feec50967db 201003_02
hgs
parents:
diff changeset
    66
// ---------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    67
// CCaUninstallOperation::ConstructL
7feec50967db 201003_02
hgs
parents:
diff changeset
    68
// ---------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    69
//
7feec50967db 201003_02
hgs
parents:
diff changeset
    70
void CCaUninstallOperation::ConstructL( CCaInnerEntry& aEntry )
7feec50967db 201003_02
hgs
parents:
diff changeset
    71
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
    72
    TBuf<KCaMaxAttrValueLen> uidAttr;
7feec50967db 201003_02
hgs
parents:
diff changeset
    73
    TUint uid = aEntry.GetUid();
7feec50967db 201003_02
hgs
parents:
diff changeset
    74
7feec50967db 201003_02
hgs
parents:
diff changeset
    75
    TUid packageUid = KNullUid;
7feec50967db 201003_02
hgs
parents:
diff changeset
    76
    TPtrC8 mimeType;
7feec50967db 201003_02
hgs
parents:
diff changeset
    77
7feec50967db 201003_02
hgs
parents:
diff changeset
    78
    if( !( aEntry.GetFlags() & ERemovable ) )
7feec50967db 201003_02
hgs
parents:
diff changeset
    79
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
    80
        User::Leave( KErrAccessDenied );
7feec50967db 201003_02
hgs
parents:
diff changeset
    81
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
    82
7feec50967db 201003_02
hgs
parents:
diff changeset
    83
    User::LeaveIfError( iUninstaller.Connect() );
7feec50967db 201003_02
hgs
parents:
diff changeset
    84
    iId = aEntry.GetId();
7feec50967db 201003_02
hgs
parents:
diff changeset
    85
    if( aEntry.GetEntryTypeName() == KCaTypeWidget() )
7feec50967db 201003_02
hgs
parents:
diff changeset
    86
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
    87
        TBuf<KMaxUidName> uidDesc;
7feec50967db 201003_02
hgs
parents:
diff changeset
    88
        aEntry.FindAttribute( KCaPackageUid, uidDesc );
7feec50967db 201003_02
hgs
parents:
diff changeset
    89
        TLex uidLex(uidDesc);
7feec50967db 201003_02
hgs
parents:
diff changeset
    90
        TUint32 uidValue;
7feec50967db 201003_02
hgs
parents:
diff changeset
    91
        User::LeaveIfError( uidLex.Val( uidValue, EHex ));
7feec50967db 201003_02
hgs
parents:
diff changeset
    92
7feec50967db 201003_02
hgs
parents:
diff changeset
    93
        packageUid.iUid = static_cast<TInt32>(uidValue);
7feec50967db 201003_02
hgs
parents:
diff changeset
    94
        mimeType.Set( KAppMimeType );
7feec50967db 201003_02
hgs
parents:
diff changeset
    95
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
    96
    else
7feec50967db 201003_02
hgs
parents:
diff changeset
    97
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
    98
        AppInfoL( TUid::Uid( uid ), mimeType, packageUid );
7feec50967db 201003_02
hgs
parents:
diff changeset
    99
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
   100
7feec50967db 201003_02
hgs
parents:
diff changeset
   101
    // Commence the uninstallations
7feec50967db 201003_02
hgs
parents:
diff changeset
   102
    iUninstaller.Uninstall( iStatus, packageUid, mimeType );
7feec50967db 201003_02
hgs
parents:
diff changeset
   103
    SetActive();
7feec50967db 201003_02
hgs
parents:
diff changeset
   104
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   105
7feec50967db 201003_02
hgs
parents:
diff changeset
   106
// ---------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   107
// CCaUninstallOperation::AppInfo
7feec50967db 201003_02
hgs
parents:
diff changeset
   108
// ---------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   109
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   110
void CCaUninstallOperation::AppInfoL( const TUid& aAppUid,
7feec50967db 201003_02
hgs
parents:
diff changeset
   111
        TPtrC8& aMimeType, TUid& aPackageUid )
7feec50967db 201003_02
hgs
parents:
diff changeset
   112
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   113
    RApaLsSession apaLsSession;
7feec50967db 201003_02
hgs
parents:
diff changeset
   114
7feec50967db 201003_02
hgs
parents:
diff changeset
   115
    User::LeaveIfError( apaLsSession.Connect() );
7feec50967db 201003_02
hgs
parents:
diff changeset
   116
    CleanupClosePushL( apaLsSession );
7feec50967db 201003_02
hgs
parents:
diff changeset
   117
    User::LeaveIfError( apaLsSession.GetAllApps() );
7feec50967db 201003_02
hgs
parents:
diff changeset
   118
7feec50967db 201003_02
hgs
parents:
diff changeset
   119
	TApaAppInfo appInfo;
7feec50967db 201003_02
hgs
parents:
diff changeset
   120
	User::LeaveIfError( apaLsSession.GetAppInfo( appInfo, aAppUid ) );
7feec50967db 201003_02
hgs
parents:
diff changeset
   121
	if( !GetInstallPkgUidL( appInfo.iFullName, aPackageUid ) )
7feec50967db 201003_02
hgs
parents:
diff changeset
   122
		{
7feec50967db 201003_02
hgs
parents:
diff changeset
   123
		aPackageUid = aAppUid;
7feec50967db 201003_02
hgs
parents:
diff changeset
   124
		}
7feec50967db 201003_02
hgs
parents:
diff changeset
   125
	aMimeType.Set( KAppMimeType );
7feec50967db 201003_02
hgs
parents:
diff changeset
   126
7feec50967db 201003_02
hgs
parents:
diff changeset
   127
    CleanupStack::PopAndDestroy( &apaLsSession );
7feec50967db 201003_02
hgs
parents:
diff changeset
   128
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   129
7feec50967db 201003_02
hgs
parents:
diff changeset
   130
// ---------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   131
// CCaUninstallOperation::GetInstallPkgUidL
7feec50967db 201003_02
hgs
parents:
diff changeset
   132
// ---------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   133
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   134
TBool CCaUninstallOperation::GetInstallPkgUidL( const TDesC& aAppFullName,
7feec50967db 201003_02
hgs
parents:
diff changeset
   135
        TUid& aPackageUid )
7feec50967db 201003_02
hgs
parents:
diff changeset
   136
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   137
    // Search for the full name of the application amongst every file name in
7feec50967db 201003_02
hgs
parents:
diff changeset
   138
    // every installed packages.
7feec50967db 201003_02
hgs
parents:
diff changeset
   139
    TBool found = EFalse;
7feec50967db 201003_02
hgs
parents:
diff changeset
   140
    Swi::RSisRegistrySession iSisRegSession;
7feec50967db 201003_02
hgs
parents:
diff changeset
   141
7feec50967db 201003_02
hgs
parents:
diff changeset
   142
    // Get the array of ids of every installed packages
7feec50967db 201003_02
hgs
parents:
diff changeset
   143
    if( KErrNone != iSisRegSession.Connect() )
7feec50967db 201003_02
hgs
parents:
diff changeset
   144
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   145
        return found;
7feec50967db 201003_02
hgs
parents:
diff changeset
   146
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
   147
    CleanupClosePushL( iSisRegSession );
7feec50967db 201003_02
hgs
parents:
diff changeset
   148
7feec50967db 201003_02
hgs
parents:
diff changeset
   149
    RArray<TUid> packageIds;
7feec50967db 201003_02
hgs
parents:
diff changeset
   150
    CleanupClosePushL( packageIds );
7feec50967db 201003_02
hgs
parents:
diff changeset
   151
7feec50967db 201003_02
hgs
parents:
diff changeset
   152
    iSisRegSession.InstalledUidsL( packageIds );
7feec50967db 201003_02
hgs
parents:
diff changeset
   153
7feec50967db 201003_02
hgs
parents:
diff changeset
   154
    RPointerArray<HBufC> packageFiles;
7feec50967db 201003_02
hgs
parents:
diff changeset
   155
    CleanupClosePushL( packageFiles );
7feec50967db 201003_02
hgs
parents:
diff changeset
   156
7feec50967db 201003_02
hgs
parents:
diff changeset
   157
    for( TInt i = 0; i < packageIds.Count() && !found; ++i )
7feec50967db 201003_02
hgs
parents:
diff changeset
   158
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   159
        const TUid packageId = packageIds[i];
7feec50967db 201003_02
hgs
parents:
diff changeset
   160
        Swi::RSisRegistryEntry packageEntry;
7feec50967db 201003_02
hgs
parents:
diff changeset
   161
7feec50967db 201003_02
hgs
parents:
diff changeset
   162
        // Get the array of file names in the current install package and look
7feec50967db 201003_02
hgs
parents:
diff changeset
   163
        // if there is one suggesting that the application was installed from
7feec50967db 201003_02
hgs
parents:
diff changeset
   164
        // the package.
7feec50967db 201003_02
hgs
parents:
diff changeset
   165
        if( KErrNone == packageEntry.Open( iSisRegSession, packageId ) )
7feec50967db 201003_02
hgs
parents:
diff changeset
   166
            {
7feec50967db 201003_02
hgs
parents:
diff changeset
   167
            CleanupClosePushL( packageEntry );
7feec50967db 201003_02
hgs
parents:
diff changeset
   168
            packageEntry.FilesL( packageFiles );
7feec50967db 201003_02
hgs
parents:
diff changeset
   169
            for( TInt pf = 0; pf < packageFiles.Count() && !found; ++pf )
7feec50967db 201003_02
hgs
parents:
diff changeset
   170
                {
7feec50967db 201003_02
hgs
parents:
diff changeset
   171
                if( packageFiles[pf]->FindC( aAppFullName ) == 0 )
7feec50967db 201003_02
hgs
parents:
diff changeset
   172
                    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   173
                    aPackageUid = packageId;
7feec50967db 201003_02
hgs
parents:
diff changeset
   174
                    found = ETrue;
7feec50967db 201003_02
hgs
parents:
diff changeset
   175
                    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   176
                }
7feec50967db 201003_02
hgs
parents:
diff changeset
   177
            packageFiles.ResetAndDestroy();
7feec50967db 201003_02
hgs
parents:
diff changeset
   178
            CleanupStack::PopAndDestroy( &packageEntry );
7feec50967db 201003_02
hgs
parents:
diff changeset
   179
            }
7feec50967db 201003_02
hgs
parents:
diff changeset
   180
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
   181
7feec50967db 201003_02
hgs
parents:
diff changeset
   182
    CleanupStack::PopAndDestroy( &packageFiles );
7feec50967db 201003_02
hgs
parents:
diff changeset
   183
    CleanupStack::PopAndDestroy( &packageIds );
7feec50967db 201003_02
hgs
parents:
diff changeset
   184
    CleanupStack::PopAndDestroy( &iSisRegSession );
7feec50967db 201003_02
hgs
parents:
diff changeset
   185
7feec50967db 201003_02
hgs
parents:
diff changeset
   186
    return found;
7feec50967db 201003_02
hgs
parents:
diff changeset
   187
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   188
7feec50967db 201003_02
hgs
parents:
diff changeset
   189
// ---------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   190
// CCaUninstallOperation::RunL
7feec50967db 201003_02
hgs
parents:
diff changeset
   191
// ---------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   192
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   193
void CCaUninstallOperation::RunL()
7feec50967db 201003_02
hgs
parents:
diff changeset
   194
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   195
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   196
7feec50967db 201003_02
hgs
parents:
diff changeset
   197
// ---------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   198
// CCaUninstallOperation::DoCancel
7feec50967db 201003_02
hgs
parents:
diff changeset
   199
// ---------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   200
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   201
void CCaUninstallOperation::DoCancel()
7feec50967db 201003_02
hgs
parents:
diff changeset
   202
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   203
    iUninstaller.CancelAsyncRequest( SwiUI::ERequestUninstall );
7feec50967db 201003_02
hgs
parents:
diff changeset
   204
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   205
7feec50967db 201003_02
hgs
parents:
diff changeset
   206
// ---------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   207
// CCaUninstallOperation::RunError
7feec50967db 201003_02
hgs
parents:
diff changeset
   208
// ---------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   209
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   210
TInt CCaUninstallOperation::RunError( TInt /* aError */)
7feec50967db 201003_02
hgs
parents:
diff changeset
   211
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   212
    return KErrNone;
7feec50967db 201003_02
hgs
parents:
diff changeset
   213
    }