diff -r 000000000000 -r c53acadfccc6 clfwrapper/ClientSrc/CCLFEngineImpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clfwrapper/ClientSrc/CCLFEngineImpl.cpp Mon Jan 18 20:34:07 2010 +0200 @@ -0,0 +1,542 @@ +/* +* Copyright (c) 2002-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: +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include "CCLFEngineImpl.h" +#include "CCLFDbItemProvider.h" +#include "CCLFItemImpl.h" +#include "CCLFDefaultOperation.h" +#include "CCLFItemListModelImpl.h" +#include "CCLFEventHandler.h" +#include "CCLFDbItemContainer.h" +#include "MGDebugPrint.h" +#include "CCLFQueryAdapter.h" + +// CONSTANTS +const TInt KCLFObserverArrayGranularity( 2 ); +const TInt KCLFChangedItemIdArrayGranularity( 10 ); + +// ----------------------------------------------------------------------------- +// CleanupTempModel +// ----------------------------------------------------------------------------- +// +void CCLFEngineImpl::CleanupTempModel( TAny* aObj ) + { + static_cast< CCLFEngineImpl::CCLFTempModel* >( aObj )->ResetModelArray(); + } + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::CCLFEngineImpl +// ----------------------------------------------------------------------------- +// +CCLFEngineImpl::CCLFEngineImpl() + : iCLFServerProxy( NULL ), + iMdESession( NULL ), + iError( KErrNone ), + iUpdateStartEventHandler( NULL ), + iUpdateEndEventHandler( NULL ), + iChangedItemObserverArray( KCLFObserverArrayGranularity ), + iProcessObserverArray( KCLFObserverArrayGranularity ), + iDbItemContainer( NULL ), + iItemProvider( NULL ), + iQueryAdapter( NULL ) + { + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::ConstructL +// ----------------------------------------------------------------------------- +// +void CCLFEngineImpl::ConstructL() + { + iMdESession = CMdESession::NewL( *this ); + if( !iActiveSchedulerWait.IsStarted() ) + { + iActiveSchedulerWait.Start(); + } + User::LeaveIfError( iError ); + iCLFServerProxy = CCLFServerProxy::NewL( *iMdESession ); + iQueryAdapter = CCLFQueryAdapter::NewL( *iMdESession ); + iUpdateStartEventHandler = CCLFEventHandler::NewL( *iCLFServerProxy, *this ); + iUpdateEndEventHandler = CCLFEventHandler::NewL( *iCLFServerProxy, *this ); + iDbItemContainer = CCLFDbItemContainer::NewL(); + iItemProvider = CCLFDbItemProvider::NewL( *iDbItemContainer, *iQueryAdapter, iMdESession ); + iUpdateEndEventHandler->ObserverUpdateEndEvent(); + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::NewLC +// ----------------------------------------------------------------------------- +// +CCLFEngineImpl* CCLFEngineImpl::NewLC() + { + CCLFEngineImpl* self = new( ELeave ) CCLFEngineImpl; + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::~CCLFEngineImpl +// Destructor +// ----------------------------------------------------------------------------- +// +CCLFEngineImpl::~CCLFEngineImpl() + { + delete iItemProvider; + delete iUpdateStartEventHandler; + delete iUpdateEndEventHandler; + delete iDbItemContainer; + delete iCLFServerProxy; + iChangedItemObserverArray.Close(); + iProcessObserverArray.Close(); + delete iQueryAdapter; + delete iMdESession; + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::AddChangedItemObserverL +// ----------------------------------------------------------------------------- +// +void CCLFEngineImpl::AddChangedItemObserverL( MCLFChangedItemObserver& aObserver ) + { + iChangedItemObserverArray.AppendL( &aObserver ); + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::RemoveChangedItemObserver +// ----------------------------------------------------------------------------- +// +void CCLFEngineImpl::RemoveChangedItemObserver( MCLFChangedItemObserver& aObserver ) + { + const TInt index( iChangedItemObserverArray.Find( &aObserver ) ); + if ( index >= 0 ) + { + iChangedItemObserverArray.Remove( index ); + } + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::AddCLFProcessObserverL +// ----------------------------------------------------------------------------- +// +void CCLFEngineImpl::AddCLFProcessObserverL( MCLFProcessObserver& aObserver ) + { + iProcessObserverArray.AppendL( &aObserver ); + if ( !iUpdateStartEventHandler->IsActive() ) + { + iUpdateStartEventHandler->ObserverUpdateStartEvent(); + } + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::RemoveCLFProcessObserver +// ----------------------------------------------------------------------------- +// +void CCLFEngineImpl::RemoveCLFProcessObserver( MCLFProcessObserver& aObserver ) + { + const TInt index( iProcessObserverArray.Find( &aObserver ) ); + if ( index >= 0 ) + { + iProcessObserverArray.Remove( index ); + } + + StopEventHandling(); + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::UpdateItemsL +// ----------------------------------------------------------------------------- +// +void CCLFEngineImpl::UpdateItemsL() + { + User::LeaveIfError( iCLFServerProxy->UpdateAllItemsL() ); + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::UpdateItemsL +// ----------------------------------------------------------------------------- +// +void CCLFEngineImpl::UpdateItemsL( const TArray& aItemIDArray ) + { + User::LeaveIfError( iCLFServerProxy->UpdateItemsL( aItemIDArray ) ); + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::UpdateItemsL +// ----------------------------------------------------------------------------- +// +void CCLFEngineImpl::UpdateItemsL( TInt aSemanticId, const TDesC8& aOpaqueData ) + { + User::LeaveIfError( iCLFServerProxy->UpdateItemsL( aSemanticId, aOpaqueData ) ); + } + +// --------------------------------------------------------------------------- +// CCLFEngineImpl::HandleSessionOpened +// --------------------------------------------------------------------------- +// +void CCLFEngineImpl::HandleSessionOpened( CMdESession& /* aSession */, const TInt aError ) + { + MG_DEBUG2( HSO, "[CLF]\t CCLFEngineImpl::HandleSessionOpened %d", aError ); + iActiveSchedulerWait.AsyncStop(); + + iError = aError; + } + +// --------------------------------------------------------------------------- +// CCLFEngineImpl::HandleSessionError +// --------------------------------------------------------------------------- +// +void CCLFEngineImpl::HandleSessionError( CMdESession& /*aSession*/, const TInt aError ) + { + MG_DEBUG2( HSE, "[CLF]\t CCLFEngineImpl::HandleSessionError %d", aError ); + + iError = aError; + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::CreateListModelLC +// ----------------------------------------------------------------------------- +// +MCLFItemListModel* CCLFEngineImpl::CreateListModelLC( + MCLFOperationObserver& aObserver ) + { + + CCLFDbItemProvider* itemProvider = CCLFDbItemProvider::NewL( *iDbItemContainer, *iQueryAdapter, iMdESession ); + // self takes ownership of itemProvider. + CCLFItemListModelImpl* self = CCLFItemListModelImpl::NewLC( itemProvider, aObserver, iChangedItemModel ); + iChangedItemModel.AddObserverL( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::CreateListModelLC +// ----------------------------------------------------------------------------- +// +MCLFItemListModel* CCLFEngineImpl::CreateListModelLC( + MCLFOperationObserver& aObserver, + TResourceReader& aReader ) + { + CCLFDbItemProvider* itemProvider = CCLFDbItemProvider::NewL( *iDbItemContainer, *iQueryAdapter, iMdESession ); + // self takes ownership of itemProvider. + CCLFItemListModelImpl* self = CCLFItemListModelImpl::NewLC( itemProvider, aObserver, iChangedItemModel, aReader ); + iChangedItemModel.AddObserverL( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::HandleUpdateEndEventL +// ----------------------------------------------------------------------------- +// +void CCLFEngineImpl::HandleUpdateEndEventL( const TInt aError ) + { + if ( aError == KErrNone ) + { + // get changed items and add new ones to array + RArray< TCLFItemId > changedItemIdArray; + CleanupClosePushL( changedItemIdArray ); + iUpdateEndEventHandler->GetChangedItemsL( changedItemIdArray ); + const TInt count( changedItemIdArray.Count() ); + for ( TInt i = 0; i < count; ++i ) + { + const TCLFItemId id( changedItemIdArray[ i ] ); + const TInt index( + iChangedItemModel.iChangedItemIdArray.Find( id ) ); + if ( index == KErrNotFound ) + { + iChangedItemModel.iChangedItemIdArray.AppendL( id ); + } + } + CleanupStack::PopAndDestroy( &changedItemIdArray ); + + if ( iChangedItemModel.iChangedItemIdArray.Count() ) + { + iDbItemContainer->SetDeprecatedItems( + iChangedItemModel.iChangedItemIdArray ); + + iItemProvider->PrepareItemsL( + iChangedItemModel.iChangedItemIdArray.Array(), + *this ); + } + else + { + // no changed items -> just notify process observers + NotifyProcessObserversL( ECLFUpdateStop ); + } + } + else + { + const TInt count( iChangedItemObserverArray.Count() ); + for ( TInt i = 0 ; i < count ; ++i ) + { + iChangedItemObserverArray[i]->HandleError( aError ); + } + } + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::OperationCompleteL +// ----------------------------------------------------------------------------- +// +void CCLFEngineImpl::OperationCompleteL( const TInt aError ) + { + // make sure that changed item model is reset + // array must be reset when changed items are handled (also in leave case) + CleanupStack::PushL( TCleanupItem( CleanupTempModel, + &iChangedItemModel) ); + + if ( aError ) + { + const TInt count( iChangedItemObserverArray.Count() ); + for( TInt i = 0 ; i < count ; ++i ) + { + iChangedItemObserverArray[i]->HandleError( aError ); + } + } + else + { + // put items to container + User::LeaveIfError( iItemProvider->GetItems( + iChangedItemModel.iItemArray ) ); + + // notify process observers + NotifyProcessObserversL( ECLFUpdateStop ); + + // notify changed item observers + if ( iChangedItemModel.iChangedItemIdArray.Count() > 0 ) + { + const TInt count( iChangedItemObserverArray.Count() ); + for( TInt i = 0 ; i < count ; ++i ) + { + iChangedItemObserverArray[i]->HandleItemChangeL( + iChangedItemModel.iChangedItemIdArray.Array() ); + } + + // notify models + iChangedItemModel.NotifyObserverL(); + } + } + CleanupStack::PopAndDestroy(); // TCleanupItem + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::HandleUpdateStartEventL +// ----------------------------------------------------------------------------- +// +void CCLFEngineImpl::HandleUpdateStartEventL( const TInt aError ) + { + if ( aError == KErrNone ) + { + NotifyProcessObserversL( ECLFUpdateStart ); + } + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::NotifyProcessObserversL +// ----------------------------------------------------------------------------- +// +void CCLFEngineImpl::NotifyProcessObserversL( TCLFProcessEvent aEvent ) + { + const TInt count( iProcessObserverArray.Count() ); + for ( TInt i = 0 ; i < count ; ++i ) + { + iProcessObserverArray[i]->HandleCLFProcessEventL( aEvent ); + } + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::StopEventHandling +// ----------------------------------------------------------------------------- +// +void CCLFEngineImpl::StopEventHandling() + { + if ( iProcessObserverArray.Count() == 0 ) + { + // stop "start observing" + iUpdateStartEventHandler->Cancel(); + } + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::CCLFTempModel::IsItemsForModel +// ----------------------------------------------------------------------------- +// +TBool CCLFEngineImpl::CCLFTempModel::IsItemsForModel( + const MDesCArray& aMimeTypes, + const TArray& aMediaTypes, + const TArray& aModelItemIds ) + { + // first from item IDs + TInt count( aModelItemIds.Count() ); + for ( TInt i = 0 ; i < count ; ++i ) + { + const TInt index( iChangedItemIdArray.FindInOrder( aModelItemIds[ i ] ) ); + if( index >= 0 ) + { + return ETrue; + } + } + + // find second from media types (faster) + count = aMediaTypes.Count(); + for ( TInt i = 0 ; i < count ; ++i ) + { + const TInt index( iMediaTypeArray.FindInOrder( aMediaTypes[ i ] ) ); + if ( index >= 0 ) + { + return ETrue; + } + } + + // and mimetypes, final from mimetypes, + // because descriptor comparation is slow + count = aMimeTypes.MdcaCount(); + const TInt mCount( iMimeTypeArray.MdcaCount() ); + for ( TInt i = 0 ; i < count ; ++i ) + { + // match model mimetypes to changed item(s) mimetypes + const TDesC& modelMimeType = aMimeTypes.MdcaPoint( i ); + for ( TInt j = 0 ; j < mCount ; ++j ) + { + const TDesC& changedItemMimeType = iMimeTypeArray.MdcaPoint( j ); + const TInt match( changedItemMimeType.Match( modelMimeType ) ); + if ( match != KErrNotFound ) + { + return ETrue; + } + } + } + + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::CCLFTempModel::CCLFTempModel +// ----------------------------------------------------------------------------- +// +CCLFEngineImpl::CCLFTempModel::CCLFTempModel() + : iItemArray( KCLFChangedItemIdArrayGranularity ), + iChangedItemIdArray( KCLFChangedItemIdArrayGranularity ), + iChangedItemProviderObserverArray( KCLFChangedItemIdArrayGranularity ), + iMimeTypeArray( KCLFChangedItemIdArrayGranularity ), + iMediaTypeArray( KCLFChangedItemIdArrayGranularity ) + { + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::CCLFTempModel::~CCLFTempModel +// ----------------------------------------------------------------------------- +// +CCLFEngineImpl::CCLFTempModel::~CCLFTempModel() + { + ResetModelArray(); + iChangedItemProviderObserverArray.Close(); + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::CCLFTempModel::AddObserverL +// ----------------------------------------------------------------------------- +// +void CCLFEngineImpl::CCLFTempModel::AddObserverL( + MCLFChangedItemProviderObserver* aObserver ) + { + iChangedItemProviderObserverArray.AppendL( aObserver ); + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::CCLFTempModel::ResetModelArray +// ----------------------------------------------------------------------------- +// +void CCLFEngineImpl::CCLFTempModel::ResetModelArray() + { + iItemArray.ResetAndDestroy(); + iMimeTypeArray.Reset(); + iMediaTypeArray.Reset(); + iChangedItemIdArray.Reset(); + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::CCLFTempModel::NotifyObserverL +// ----------------------------------------------------------------------------- +// +void CCLFEngineImpl::CCLFTempModel::NotifyObserverL() + { + PrepareModelL(); + + const TInt providerObserverCount( + iChangedItemProviderObserverArray.Count() ); + for ( TInt i = 0 ; i < providerObserverCount ; ++i ) + { + iChangedItemProviderObserverArray[i]->NewChangedItemsL(); + } + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::CCLFTempModel::PrepareModelL +// ----------------------------------------------------------------------------- +// +void CCLFEngineImpl::CCLFTempModel::PrepareModelL() + { + // sort array for faster find + iChangedItemIdArray.Sort(); + + // get mimetypes and media types from items + const TInt modelCount( iItemArray.Count() ); + for ( TInt i = 0 ; i < modelCount ; ++i ) + { + MCLFItem* item = iItemArray[ i ]; + + TInt32 mediaType( 0 ); + TInt error( item->GetField( ECLFFieldIdMediaType, mediaType ) ); + if ( error == KErrNone && + iMediaTypeArray.FindInOrder( mediaType ) == KErrNotFound ) + { + User::LeaveIfError( iMediaTypeArray.InsertInOrder( mediaType ) ); + } + TPtrC mimeType; + error = item->GetField( ECLFFieldIdMimeType, mimeType ); + TInt pos( 0 ); + if ( error == KErrNone && + iMimeTypeArray.FindIsq( mimeType, pos ) != 0 ) // not found + { + iMimeTypeArray.InsertIsqL( mimeType ); + } + } + } + +// ----------------------------------------------------------------------------- +// CCLFEngineImpl::CCLFTempModel::ChangedItemProviderRemoveObserver +// ----------------------------------------------------------------------------- +// +void CCLFEngineImpl::CCLFTempModel::RemoveChangedItemProviderObserver( + MCLFChangedItemProviderObserver* aObserver ) + { + const TInt index( iChangedItemProviderObserverArray.Find( aObserver ) ); + if ( index >= 0 ) + { + iChangedItemProviderObserverArray.Remove( index ); + } + } + +// End of File