contentstorage/casrv/causifscanner/src/causifscanner.cpp
branchRCL_3
changeset 113 0efa10d348c0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contentstorage/casrv/causifscanner/src/causifscanner.cpp	Tue Aug 31 15:30:51 2010 +0300
@@ -0,0 +1,374 @@
+/*
+ * Copyright (c) 2009 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: causifscanner.cpp
+ *
+ */
+
+#include <e32property.h>
+#include <f32file.h>
+#include <badesca.h>
+
+#include "causifscanner.h"
+#include "cainnerentry.h"
+#include "cainnerquery.h"
+#include "cadef.h"
+#include "castorageproxy.h"
+#include "caarraycleanup.inl"
+
+using namespace Usif;
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CCaUsifScanner* CCaUsifScanner::NewL( TPluginParams* aPluginParams )
+    {
+    CCaUsifScanner* self = new ( ELeave ) CCaUsifScanner(
+            *aPluginParams->storageProxy, *aPluginParams->softwareRegistry );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CCaUsifScanner::CCaUsifScanner( CCaStorageProxy& aStorageProxy,
+    RSoftwareComponentRegistry& aSoftwareRegistry ) :
+        iStorageProxy( aStorageProxy ), iSoftwareRegistry(aSoftwareRegistry)
+    {
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CCaUsifScanner::ConstructL()
+    {
+    iSystemInstallNotifier = CCaInstallNotifier::NewL( *this,
+            CCaInstallNotifier::ESisInstallNotification );
+
+    iUsifUninstallNotifier = CCaInstallNotifier::NewL( *this,
+            CCaInstallNotifier::EUsifUninstallNotification );
+
+    iJavaInstallNotifier = CCaInstallNotifier::NewL( *this,
+                CCaInstallNotifier::EJavaInstallNotification );
+
+    User::LeaveIfError( iFs.Connect() );
+    iMmcWatcher = CCaMmcWatcher::NewL( iFs, this );
+
+    UpdateUsifListL();
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CCaUsifScanner::~CCaUsifScanner()
+    {
+    delete iMmcWatcher;
+    iFs.Close();
+    delete iJavaInstallNotifier;
+    delete iUsifUninstallNotifier;
+    delete iSystemInstallNotifier;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+/*void CCaUsifScanner::InstallL( const TDesC& aFileName )
+ {
+ RSoftwareInstall sif;
+ CleanupClosePushL( sif );
+ User::LeaveIfError( sif.Connect());
+
+ // Install the component
+ TRequestStatus status;
+ sif.Install( aFileName, status, EFalse );
+ User::WaitForRequest( status );
+ User::LeaveIfError(status.Int());
+
+ // Disconnect from the SIF server
+ CleanupStack::PopAndDestroy( &sif );
+ }*/
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CCaUsifScanner::HandleInstallNotifyL( TInt /*aUid*/)
+    {
+    UpdateUsifListL();
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC SKIP
+#endif //COVERAGE_MEASUREMENT
+void CCaUsifScanner::MmcChangeL()
+    {
+    UpdateUsifListL();
+    }
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC ENDSKIP
+#endif //COVERAGE_MEASUREMENT
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CCaUsifScanner::UpdateUsifListL()
+    {
+    AddPackageL();
+    UpdatePackagesL();
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CCaUsifScanner::CreateCaEntryFromEntryL(
+        const CComponentEntry* aEntry, CCaInnerEntry* aCaEntry )
+    {
+    aCaEntry->SetRole( EItemEntryRole );
+    aCaEntry->SetEntryTypeNameL( KCaTypePackage );
+    if( !aEntry->SoftwareType().Compare( KSoftwareTypeNative ) )
+        {
+        aCaEntry->AddAttributeL( KCaAttrAppType, KCaAttrAppTypeValueNative );
+        }
+    else if( !aEntry->SoftwareType().Compare( KSoftwareTypeJava ) )
+        {
+        aCaEntry->AddAttributeL( KCaAttrAppType, KCaAttrAppTypeValueJava );
+        }
+    if( aEntry->Name().Compare( KNullDesC ) )
+        {
+        aCaEntry->SetTextL( aEntry->Name() );
+        }
+    if( !aEntry->IsHidden() )
+        {
+        aCaEntry->SetFlags( EVisible );
+        }
+    if( aEntry->IsRemovable() )
+        {
+        aCaEntry->SetFlags( aCaEntry->GetFlags() | ERemovable );
+        }
+    // entries obtained with usif should have component id.
+    //it's needed for uninstalling
+    RBuf compIdDesc;
+    CleanupClosePushL( compIdDesc );
+    compIdDesc.CreateL( KCaMaxAttrValueLen );
+    compIdDesc.Num( aEntry->ComponentId() );
+    aCaEntry->AddAttributeL( KCaAttrComponentId, compIdDesc );
+    CleanupStack::PopAndDestroy( &compIdDesc );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CCaUsifScanner::AddPackageL()
+    {
+    RPointerArray<CCaInnerEntry> entries;
+    CleanupResetAndDestroyPushL( entries );
+    GetCaPackageEntriesL( entries );
+
+    RPointerArray<CComponentEntry> resultUsifArray;
+    CleanupResetAndDestroyPushL( resultUsifArray );
+    GetUsifPackageEntriesL( resultUsifArray );
+
+    for( TInt i(0); i < resultUsifArray.Count(); i++ )
+        {
+        TInt entryIndex = PackageExists( entries, resultUsifArray[i]);
+        // entry is not present in CaStorage
+        if( entryIndex == KErrNotFound )
+            {
+            CCaInnerEntry *caEntry = CCaInnerEntry::NewLC();
+            CreateCaEntryFromEntryL( resultUsifArray[i], caEntry );
+            // in case we rebuild our db mark as missing
+            if( !(iSoftwareRegistry.IsComponentPresentL( 
+                    resultUsifArray[i]->ComponentId())) )
+                {
+                caEntry->SetFlags( caEntry->GetFlags() | EMissing );
+                }
+            iStorageProxy.AddL( caEntry );
+            CleanupStack::PopAndDestroy( caEntry );
+            } 
+        // found in the CaStorage, mark is as missing
+        else if( !(iSoftwareRegistry.IsComponentPresentL( 
+                resultUsifArray[i]->ComponentId() ))  ) 
+            {
+            if( !( entries[entryIndex]->GetFlags() & EMissing ) )
+                {
+                entries[entryIndex]->SetFlags( 
+                        ( entries[entryIndex]->GetFlags() | EMissing ) );
+                iStorageProxy.AddL( 
+                        entries[entryIndex], EFalse, EItemDisappeared );
+                }
+            }
+        // found in the storage remove missing flag as this is Present in scr
+        else if (entries[entryIndex]->GetFlags() & EMissing)
+            {
+            entries[entryIndex]->SetFlags( 
+                    entries[entryIndex]->GetFlags() & ~EMissing );
+            iStorageProxy.AddL( entries[entryIndex]);            
+            }
+        }
+
+    CleanupStack::PopAndDestroy( &resultUsifArray );
+    CleanupStack::PopAndDestroy( &entries );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CCaUsifScanner::UpdatePackagesL()
+    {
+    RPointerArray<CCaInnerEntry> resultCaArray;
+    CleanupResetAndDestroyPushL( resultCaArray );
+    GetCaPackageEntriesL( resultCaArray );
+
+    RPointerArray<CComponentEntry> resultUsifArray;
+    CleanupResetAndDestroyPushL( resultUsifArray );
+    GetUsifPackageEntriesL( resultUsifArray );
+
+    FindDeletedEntriesL( resultCaArray, resultUsifArray );
+    RemoveEntriesFromDbL( resultCaArray );
+
+    CleanupStack::PopAndDestroy( &resultUsifArray );
+    CleanupStack::PopAndDestroy( &resultCaArray );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CCaUsifScanner::GetCaPackageEntriesL(
+        RPointerArray<CCaInnerEntry>& aArray )
+    {
+    CCaInnerQuery* allAppQuery = CCaInnerQuery::NewLC();
+    CDesC16ArrayFlat* appType =
+            new ( ELeave ) CDesC16ArrayFlat( KGranularityOne );
+    CleanupStack::PushL( appType );
+    appType->AppendL( KCaTypePackage );
+    allAppQuery->SetEntryTypeNames( appType );
+    CleanupStack::Pop( appType );
+    iStorageProxy.GetEntriesL( allAppQuery, aArray );
+    CleanupStack::PopAndDestroy( allAppQuery );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CCaUsifScanner::GetUsifPackageEntriesL(
+        RPointerArray<CComponentEntry>& aArray )
+    {
+    CComponentFilter *filter = CComponentFilter::NewL();
+    CleanupStack::PushL( filter );
+    filter->SetRemovable( ETrue );
+    filter->SetHidden( EFalse );
+
+    // Create an SCR view
+    RSoftwareComponentRegistryView scrView;
+    CleanupClosePushL( scrView );
+    scrView.OpenViewL( iSoftwareRegistry, filter );
+
+    // Iterate over the matching components
+    //The ownership is transferred to the calling client.
+    while( CComponentEntry* entry = scrView.NextComponentL() )
+        {
+        CleanupStack::PushL( entry );
+        aArray.AppendL( entry );
+        CleanupStack::Pop( entry );
+        }
+    CleanupStack::PopAndDestroy( &scrView );
+    CleanupStack::PopAndDestroy( filter );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TInt CCaUsifScanner::PackageExists( RPointerArray<CCaInnerEntry>& aArray,
+        const CComponentEntry* aEntry )
+    {
+    TInt retVal( KErrNotFound );
+    for( TInt i( 0 ); i < aArray.Count(); i++ )
+        {
+        TBuf<KMaxUnits> compIdDes;
+        if( aArray[i]->FindAttribute( KCaAttrComponentId, compIdDes ) )
+            {
+            TLex lex( compIdDes );
+            TUint uint( 0 );
+            if( lex.Val( uint ) == KErrNone && aEntry->ComponentId() == uint )
+                {
+                retVal = i;
+                }
+            }
+        }
+    return retVal;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CCaUsifScanner::FindDeletedEntriesL(
+        RPointerArray<CCaInnerEntry>& aCaArray, const RPointerArray<
+                CComponentEntry>& aUsifArray )
+    {
+    for( TInt i( aCaArray.Count() - 1 ); i >= 0; i-- )
+        {
+        TBuf<KMaxUnits> compIdDes;
+        if( aCaArray[i]->FindAttribute( KCaAttrComponentId, compIdDes ) )
+            {
+            TLex lex( compIdDes );
+            TUint uint( 0 );
+            User::LeaveIfError( lex.Val( uint ) );
+            //for each usif entry check if entry has to be removed
+            for( TInt k( 0 ); k < aUsifArray.Count(); k++ )
+                {
+                if( aUsifArray[k]->ComponentId() == uint)
+                    {
+                    delete aCaArray[i];
+                    aCaArray.Remove( i );
+                    break;
+                    }
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CCaUsifScanner::RemoveEntriesFromDbL(
+        RPointerArray<CCaInnerEntry>& aCaArray )
+    {
+    RArray<TInt> entriesId;
+    CleanupClosePushL( entriesId );
+    for( TInt i( 0 ); i < aCaArray.Count(); i++ )
+        {
+        entriesId.Append( aCaArray[i]->GetId() );
+        }
+    iStorageProxy.RemoveL( entriesId );
+    CleanupStack::PopAndDestroy( &entriesId );
+    }