contentstorage/handlersrc/cauninstalloperation.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 19 Mar 2010 09:35:23 +0200
changeset 60 f62f87b200ec
permissions -rw-r--r--
Revision: 201007 Kit: 201011

/*
 * Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
 * Initial Contributors:
 * Nokia Corporation - initial contribution.
 *
 * Contributors:
 *
 * Description:  ?Description
 *
 */

#include <apgcli.h>
#include <swi/sisregistrysession.h>
#include <swi/sisregistryentry.h>
#include "cautils.h"
#include "cadef.h"
#include "cainnerentry.h"
#include "cauninstalloperation.h"
_LIT8( KAppMimeType, "x-epoc/x-sisx-app" );

// ================= MEMBER FUNCTIONS =======================

// ---------------------------------------------------------------------------
// CCaUninstallOperation::~CCaUninstallOperation
// ---------------------------------------------------------------------------
//
CCaUninstallOperation::~CCaUninstallOperation()
    {
    Cancel();
    iUninstaller.Close();
    }

// ---------------------------------------------------------------------------
// CCaUninstallOperation::NewL
// ---------------------------------------------------------------------------
//
CCaUninstallOperation* CCaUninstallOperation::NewL( CCaInnerEntry &aEntry,
        TInt aPriority )
    {
    CCaUninstallOperation* self;

    self = new ( ELeave ) CCaUninstallOperation( aEntry, aPriority );
    CleanupStack::PushL( self );
    self->ConstructL( aEntry );
    CleanupStack::Pop( self );
    return self;
    }

// ---------------------------------------------------------------------------
// CCaUninstallOperation::CCaUninstallOperation
// ---------------------------------------------------------------------------
//
CCaUninstallOperation::CCaUninstallOperation( CCaInnerEntry& aEntry,
        TInt aPriority ) :
    CActive( aPriority ), iEntry( aEntry ), iUninstaller(), iId( 0 )
    {
    CActiveScheduler::Add( this );
    }

// ---------------------------------------------------------------------------
// CCaUninstallOperation::ConstructL
// ---------------------------------------------------------------------------
//
void CCaUninstallOperation::ConstructL( CCaInnerEntry& aEntry )
    {
    TBuf<KCaMaxAttrValueLen> uidAttr;
    TUint uid = aEntry.GetUid();

    TUid packageUid = KNullUid;
    TPtrC8 mimeType;

    if( !( aEntry.GetFlags() & ERemovable ) )
        {
        User::Leave( KErrAccessDenied );
        }

    User::LeaveIfError( iUninstaller.Connect() );
    iId = aEntry.GetId();
    if( aEntry.GetEntryTypeName() == KCaTypeWidget() )
        {
        TBuf<KMaxUidName> uidDesc;
        aEntry.FindAttribute( KCaPackageUid, uidDesc );
        TLex uidLex(uidDesc);
        TUint32 uidValue;
        User::LeaveIfError( uidLex.Val( uidValue, EHex ));

        packageUid.iUid = static_cast<TInt32>(uidValue);
        mimeType.Set( KAppMimeType );
        }
    else
        {
        AppInfoL( TUid::Uid( uid ), mimeType, packageUid );
        }

    // Commence the uninstallations
    iUninstaller.Uninstall( iStatus, packageUid, mimeType );
    SetActive();
    }

// ---------------------------------------------------------------------------
// CCaUninstallOperation::AppInfo
// ---------------------------------------------------------------------------
//
void CCaUninstallOperation::AppInfoL( const TUid& aAppUid,
        TPtrC8& aMimeType, TUid& aPackageUid )
    {
    RApaLsSession apaLsSession;

    User::LeaveIfError( apaLsSession.Connect() );
    CleanupClosePushL( apaLsSession );
    User::LeaveIfError( apaLsSession.GetAllApps() );

	TApaAppInfo appInfo;
	User::LeaveIfError( apaLsSession.GetAppInfo( appInfo, aAppUid ) );
	if( !GetInstallPkgUidL( appInfo.iFullName, aPackageUid ) )
		{
		aPackageUid = aAppUid;
		}
	aMimeType.Set( KAppMimeType );

    CleanupStack::PopAndDestroy( &apaLsSession );
    }

// ---------------------------------------------------------------------------
// CCaUninstallOperation::GetInstallPkgUidL
// ---------------------------------------------------------------------------
//
TBool CCaUninstallOperation::GetInstallPkgUidL( const TDesC& aAppFullName,
        TUid& aPackageUid )
    {
    // Search for the full name of the application amongst every file name in
    // every installed packages.
    TBool found = EFalse;
    Swi::RSisRegistrySession iSisRegSession;

    // Get the array of ids of every installed packages
    if( KErrNone != iSisRegSession.Connect() )
        {
        return found;
        }
    CleanupClosePushL( iSisRegSession );

    RArray<TUid> packageIds;
    CleanupClosePushL( packageIds );

    iSisRegSession.InstalledUidsL( packageIds );

    RPointerArray<HBufC> packageFiles;
    CleanupClosePushL( packageFiles );

    for( TInt i = 0; i < packageIds.Count() && !found; ++i )
        {
        const TUid packageId = packageIds[i];
        Swi::RSisRegistryEntry packageEntry;

        // Get the array of file names in the current install package and look
        // if there is one suggesting that the application was installed from
        // the package.
        if( KErrNone == packageEntry.Open( iSisRegSession, packageId ) )
            {
            CleanupClosePushL( packageEntry );
            packageEntry.FilesL( packageFiles );
            for( TInt pf = 0; pf < packageFiles.Count() && !found; ++pf )
                {
                if( packageFiles[pf]->FindC( aAppFullName ) == 0 )
                    {
                    aPackageUid = packageId;
                    found = ETrue;
                    }
                }
            packageFiles.ResetAndDestroy();
            CleanupStack::PopAndDestroy( &packageEntry );
            }
        }

    CleanupStack::PopAndDestroy( &packageFiles );
    CleanupStack::PopAndDestroy( &packageIds );
    CleanupStack::PopAndDestroy( &iSisRegSession );

    return found;
    }

// ---------------------------------------------------------------------------
// CCaUninstallOperation::RunL
// ---------------------------------------------------------------------------
//
void CCaUninstallOperation::RunL()
    {
    }

// ---------------------------------------------------------------------------
// CCaUninstallOperation::DoCancel
// ---------------------------------------------------------------------------
//
void CCaUninstallOperation::DoCancel()
    {
    iUninstaller.CancelAsyncRequest( SwiUI::ERequestUninstall );
    }

// ---------------------------------------------------------------------------
// CCaUninstallOperation::RunError
// ---------------------------------------------------------------------------
//
TInt CCaUninstallOperation::RunError( TInt /* aError */)
    {
    return KErrNone;
    }