contentstorage/handlersrc/cauninstalloperation.cpp
changeset 60 f62f87b200ec
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contentstorage/handlersrc/cauninstalloperation.cpp	Fri Mar 19 09:35:23 2010 +0200
@@ -0,0 +1,213 @@
+/*
+ * 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;
+    }