diff -r 053c6c7c14f3 -r 0efa10d348c0 contentstorage/casrv/causifscanner/src/causifscanner.cpp --- /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 +#include +#include + +#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 entries; + CleanupResetAndDestroyPushL( entries ); + GetCaPackageEntriesL( entries ); + + RPointerArray 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 resultCaArray; + CleanupResetAndDestroyPushL( resultCaArray ); + GetCaPackageEntriesL( resultCaArray ); + + RPointerArray resultUsifArray; + CleanupResetAndDestroyPushL( resultUsifArray ); + GetUsifPackageEntriesL( resultUsifArray ); + + FindDeletedEntriesL( resultCaArray, resultUsifArray ); + RemoveEntriesFromDbL( resultCaArray ); + + CleanupStack::PopAndDestroy( &resultUsifArray ); + CleanupStack::PopAndDestroy( &resultCaArray ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CCaUsifScanner::GetCaPackageEntriesL( + RPointerArray& 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& 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& aArray, + const CComponentEntry* aEntry ) + { + TInt retVal( KErrNotFound ); + for( TInt i( 0 ); i < aArray.Count(); i++ ) + { + TBuf 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& aCaArray, const RPointerArray< + CComponentEntry>& aUsifArray ) + { + for( TInt i( aCaArray.Count() - 1 ); i >= 0; i-- ) + { + TBuf 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& aCaArray ) + { + RArray entriesId; + CleanupClosePushL( entriesId ); + for( TInt i( 0 ); i < aCaArray.Count(); i++ ) + { + entriesId.Append( aCaArray[i]->GetId() ); + } + iStorageProxy.RemoveL( entriesId ); + CleanupStack::PopAndDestroy( &entriesId ); + }