diff -r 1a2a00e78665 -r f62f87b200ec contentstorage/casrv/causifscanner/src/causifscanner.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contentstorage/casrv/causifscanner/src/causifscanner.cpp Fri Mar 19 09:35:23 2010 +0200 @@ -0,0 +1,283 @@ +/* + * 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 +#include +#include + +#include "causifscanner.h" +#include "cainnerentry.h" +#include "cainnerquery.h" +#include "cadef.h" +#include "castorageproxy.h" +#include "caarraycleanup.inl" + +using namespace Usif; + +_LIT( KUsifPluginCollection, "Usif collection"); +_LIT( KCaAttrComponentId, "component_id" ); + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CCaUsifScanner* CCaUsifScanner::NewL( TPluginParams* aPluginParams ) + { + CCaUsifScanner* self = new ( ELeave ) + CCaUsifScanner( *aPluginParams->storageProxy ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CCaUsifScanner::CCaUsifScanner( CCaStorageProxy& aStorageProxy ) : + iStorageProxy( aStorageProxy ) + { + + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CCaUsifScanner::ConstructL() + { + AddCollectionUsifL(); + AddNativeAppsL(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CCaUsifScanner::~CCaUsifScanner() + { + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +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::AddCollectionUsifL() + { + if( GetCollectionUsifIdL() == 0 ) + { + CCaInnerEntry *entry = CCaInnerEntry::NewLC(); + entry->SetRole( EGroupEntryRole ); + entry->SetEntryTypeNameL( KCaTypeCollection ); + entry->SetFlags( ERemovable | EVisible ); + entry->SetTextL( KUsifPluginCollection ); + iStorageProxy.AddL( entry ); + iCollectionUsifId = entry->GetId(); + CleanupStack::PopAndDestroy( entry ); + + TCaOperationParams params = + { + TCaOperationParams::EPrepend, 2, 0 + }; + RArray ids; + CleanupClosePushL( ids ); + ids.AppendL( iCollectionUsifId ); + iStorageProxy.OrganizeL( ids, params ); + CleanupStack::PopAndDestroy( &ids ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CCaUsifScanner::GetCollectionUsifIdL() + { + if( iCollectionUsifId == 0 ) + { + RPointerArray resultArray; + CleanupResetAndDestroyPushL( resultArray ); + CCaInnerQuery* allAppQuery = CCaInnerQuery::NewLC(); + CDesC16ArrayFlat* appType = new ( ELeave ) CDesC16ArrayFlat( 1 ); + CleanupStack::PushL( appType ); + appType->AppendL( KCaTypeCollection ); + allAppQuery->SetEntryTypeNames( appType ); + allAppQuery->SetRole(CCaInnerQuery::Group); + CleanupStack::Pop( appType ); + iStorageProxy.GetEntriesL( allAppQuery, resultArray ); + CleanupStack::PopAndDestroy( allAppQuery ); + for(TInt i(0); i< resultArray.Count(); i++ ) + { + if(!resultArray[i]->GetText().Compare(KUsifPluginCollection)) + iCollectionUsifId = resultArray[i]->GetId(); + } + CleanupStack::PopAndDestroy( &resultArray ); + } + return iCollectionUsifId; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CCaUsifScanner::CreateCaEntryFromEntryL( + const CComponentEntry* aEntry, CCaInnerEntry* aCaEntry ) + { + aCaEntry->SetRole( EItemEntryRole ); + aCaEntry->SetEntryTypeNameL(KCaTypeApp); + if( aEntry->Name().Compare(KNullDesC)) + { + aCaEntry->SetTextL(aEntry->Name()); + } + if( !aEntry->IsHidden() ) + { + aCaEntry->SetFlags( EVisible ); + } + if( aEntry->IsRemovable() ) + { + aCaEntry->SetFlags( aCaEntry->GetFlags() | ERemovable ); + } + if( aEntry->GlobalId().Compare( KNullDesC ) ) + { + TLex lex( aEntry->GlobalId() ); + TUint uint( 0 ); + User::LeaveIfError( lex.Val( uint, EHex ) ); + aCaEntry->SetUid( uint ); + } + RBuf compIdDesc; + CleanupClosePushL(compIdDesc); + compIdDesc.CreateL(KCaMaxAttrValueLen); + compIdDesc.Num(aEntry->ComponentId()); + aCaEntry->AddAttributeL( KCaAttrComponentId, compIdDesc ); + CleanupStack::PopAndDestroy( &compIdDesc ); + + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CCaUsifScanner::AddNativeAppsL() + { + TLanguage locale = TLanguage(-1); + + CComponentFilter *filter = CComponentFilter::NewL(); + CleanupStack::PushL(filter); + filter->SetSoftwareTypeL( KSoftwareTypeNative ); + filter->SetRemovable(ETrue); + + // Connect to the SCR server + RSoftwareComponentRegistry *scr = new RSoftwareComponentRegistry(); + CleanupClosePushL(*scr); + User::LeaveIfError( scr->Connect() ); + + // Create an SCR view + RSoftwareComponentRegistryView *scrView = + new RSoftwareComponentRegistryView(); + CleanupClosePushL(*scrView); + scrView->OpenViewL( *scr, filter ); + + // Iterate over the matching components + CComponentEntry* entry = CComponentEntry::NewLC(); + + RPointerArray entries; + CleanupResetAndDestroyPushL( entries ); + GetCaAppEntriesL(entries); + + RArray entryIds; + CleanupClosePushL(entryIds); + while( scrView->NextComponentL( *entry, locale ) ) + { + CCaInnerEntry *caEntry = CCaInnerEntry::NewLC(); + CreateCaEntryFromEntryL( entry, caEntry ); + + if( !AppExist(entries, caEntry)) + { + iStorageProxy.AddL( caEntry ); + entryIds.Append( caEntry->GetId() ); + } + CleanupStack::PopAndDestroy( caEntry ); + } + TCaOperationParams params = + { + TCaOperationParams::EAppend, iCollectionUsifId, 0 + }; + iStorageProxy.OrganizeL( entryIds, params ); + + CleanupStack::PopAndDestroy( &entryIds ); + CleanupStack::PopAndDestroy( &entries ); + CleanupStack::PopAndDestroy( entry ); + CleanupStack::PopAndDestroy(scrView); + CleanupStack::PopAndDestroy(scr); + CleanupStack::PopAndDestroy(filter); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CCaUsifScanner::GetCaAppEntriesL( + RPointerArray& aArray ) + { + CCaInnerQuery* allAppQuery = CCaInnerQuery::NewLC(); + CDesC16ArrayFlat* appType = new ( ELeave ) CDesC16ArrayFlat( 1 ); + CleanupStack::PushL( appType ); + appType->AppendL( KCaTypeApp ); + allAppQuery->SetEntryTypeNames( appType ); + CleanupStack::Pop( appType ); + iStorageProxy.GetEntriesL( allAppQuery, aArray ); + CleanupStack::PopAndDestroy( allAppQuery ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CCaUsifScanner::AppExist( RPointerArray& aArray, + CCaInnerEntry* aEntry ) + { + for (TInt i(0); i < aArray.Count(); i++) + { + if( aArray[i]->GetUid() == aEntry->GetUid()) + return KErrAlreadyExists; + } + return KErrNone; + }