diff -r 2883a5458389 -r a5692c68d772 controlpanelui/src/tonefetcher/tonefetcherengine/private/CToneSelection.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/controlpanelui/src/tonefetcher/tonefetcherengine/private/CToneSelection.cpp Fri Jun 25 17:12:20 2010 +0800 @@ -0,0 +1,405 @@ +/* + * 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: + * The source file for mde tone fetcher. + * + */ +#include "CToneSelection.h" +#include +#include +#include "tonefetcherengine.h" +#include "MToneSelectionWatcher.h" +#include +#include +#include +#include + +//refresh interval, 2 seconds. +const TInt KTimerInterval = 2 * 1000 * 1000; +const TInt KObserverCallStep = 100; +// CONSTANTS +_LIT( KMimeMp3, "mp3" ); + +CMFActiveCaller* CMFActiveCaller::NewL( CToneSelection* aObserver ) + { + CMFActiveCaller* self = new (ELeave) CMFActiveCaller( aObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +CMFActiveCaller::~CMFActiveCaller() + { + Cancel(); + iTimer.Close(); + } + +CMFActiveCaller::CMFActiveCaller(CToneSelection* aObserver) : CActive(CActive::EPriorityStandard) + { + iObserver = aObserver; + } + +void CMFActiveCaller::ConstructL() + { + User::LeaveIfError( iTimer.CreateLocal() ); + CActiveScheduler::Add( this ); + } + +void CMFActiveCaller::DoCancel() + { + iTimer.Cancel(); + } + +void CMFActiveCaller::RunL() + { + iObserver->ChangeObject(); + } + +void CMFActiveCaller::Request() + { + Cancel(); + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + } + +void CMFActiveCaller::Start( TInt aMilliseconds ) + { + Cancel(); + + if ( aMilliseconds <= 0 ) + { + Request(); // no delay - complete asap + } + else + { + iTimer.After( iStatus, aMilliseconds ); + SetActive(); + } + } + +void CMFActiveCaller::Stop() + { + Cancel(); + } + +CToneSelection* CToneSelection::NewL( MToneSelectionWatcher *aWatcher ) + { + CToneSelection* self = CToneSelection::NewLC(aWatcher); + CleanupStack::Pop( self ); + return self; + } + +CToneSelection* CToneSelection::NewLC( MToneSelectionWatcher *aWatcher ) + { + CToneSelection* self = new ( ELeave ) CToneSelection( aWatcher ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +void CToneSelection::ConstructL() + { + iSession = CMdESession::NewL( *this ); + iObjectNotificationCaller = CMFActiveCaller::NewL( this ); + } + +CToneSelection::CToneSelection( MToneSelectionWatcher *aWatcher ) : iToneSelectionWatcher( aWatcher ) + { + iMediaFileCounter = 0; + iIsQuerying = EFalse; + } + +CToneSelection::~CToneSelection() + { + iResultArray.ResetAndDestroy(); + delete iQuery; + delete iSession; + delete iObjectNotificationCaller; + } + +void CToneSelection::HandleSessionOpened( CMdESession& /*aSession*/, TInt aError ) + { + if ( aError != KErrNone ) + { + iDefNS = 0; + delete iSession; + iSession = 0; + iSessionOpen = EFalse; + iToneSelectionWatcher->HandleMdeSessionError( aError ); + } + else + { + iDefNS = &iSession->GetDefaultNamespaceDefL(); + iSessionOpen = ETrue; + TRAP_IGNORE( AddObjectObserverL() ); + iToneSelectionWatcher->HandleMdeSessionOpened(); + } + } + + + +void CToneSelection::HandleSessionError( CMdESession& /*aSession*/, TInt aError ) + { + if ( aError == KErrNone ) + { + return; + } + + delete iSession; + iSession = 0; + iSessionOpen = EFalse; + iToneSelectionWatcher->HandleMdeSessionError( aError ); + } + +void CToneSelection::HandleQueryNewResults( CMdEQuery& /*aQuery*/, + TInt /*aFirstNewItemIndex*/, + TInt /*aNewItemCount*/ ) + { + } + +void CToneSelection::HandleObjectNotification( CMdESession& /*aSession*/, + TObserverNotificationType aType, + const RArray& aObjectIdArray ) + { + /*if ( aObjectIdArray.Count() > 0 && ( aType == ENotifyAdd || aType == ENotifyModify || aType == ENotifyRemove ) ) + { + QString str("CToneSelection::HandleObjectNotification " + QString::number(aObjectIdArray.Count()) + " " + QString::number(aType)); + TF_LOG(str); + iMediaFileCounter = iMediaFileCounter + aObjectIdArray.Count(); + if ( iMediaFileCounter >= KObserverCallStep ) + { + iMediaFileCounter = 0; + iToneSelectionWatcher->HandleObjectChanged(); + } + else + { + iObjectNotificationCaller->Start(KTimerInterval); + } + }*/ + } + +void CToneSelection::AddObjectObserverL() + { + if ( iSessionOpen ) + { + TUint32 notificationType = ENotifyAdd | ENotifyModify | ENotifyRemove; + iSession->AddObjectObserverL( *this, 0, notificationType, iDefNS ); + + iSession->AddObjectPresentObserverL( *this ); + } + } + +void CToneSelection::HandleObjectPresentNotification( CMdESession& /*aSession*/, + TBool /*aPresent*/, const RArray& aObjectIdArray ) + { + + if( aObjectIdArray.Count() > 0 ) + { + //if query is executing, we do not allow the fresh of contents + if ( iIsQuerying ) + { + iMediaFileCounter = 0; + return; + } + QString str("CToneSelection::HandleObjectPresentNotification " + QString::number(aObjectIdArray.Count())); + TF_LOG(str); + iMediaFileCounter = iMediaFileCounter + aObjectIdArray.Count(); + if ( iMediaFileCounter > KObserverCallStep ) + { + iMediaFileCounter = 0; + iToneSelectionWatcher->HandleObjectChanged(); + } + else + { + iObjectNotificationCaller->Start(KTimerInterval); + } + } + } + +void CToneSelection::HandleQueryCompleted( CMdEQuery& aQuery, TInt aError ) + { + iIsQuerying = EFalse; + iResultArray.ResetAndDestroy(); + if ( aError == KErrCancel ) + { + iToneSelectionWatcher->HandleQueryError( aError ); + return; + } + else + { + CMdEObjectQuery* query = static_cast (&aQuery); + TInt count = query->Count(); + for (TInt i = 0; i < count; ++i) + { + CMdEObject* object = + (CMdEObject*) query->TakeOwnershipOfResult(i); + CleanupStack::PushL(object); + CMdEPropertyDef& propDef = + CToneSelection::PropertyDefL( iSession, CToneSelection::EAttrSongName ); + + CMdEProperty* property = 0; + TInt err = object->Property( propDef, property, 0 ); + if ( err != KErrNotFound && property ) + { + HBufC* songUri = HBufC::NewL( object->Uri().Length() ); + TPtr ptr = songUri->Des(); + ptr.Copy( object->Uri() ); + iResultArray.AppendL( songUri ); + } + CleanupStack::PopAndDestroy( object ); + } + iToneSelectionWatcher->HandleQueryComplete( iResultArray ); + } + } + +void CToneSelection::QueryTonesL() + { + LeaveIfSessionClosedL(); + delete iQuery; + iQuery = 0; + CMdEObjectDef& musicObjectDef = + iDefNS->GetObjectDefL( MdeConstants::Audio::KAudioObject ); + iQuery = iSession->NewObjectQueryL( *iDefNS, musicObjectDef, this ); + + // set attributes that are included in query result + CMdEPropertyDef& namePropertyDef = PropertyDefL( EAttrSongName ); + iQuery->AddPropertyFilterL( &namePropertyDef ); + + iQuery->SetResultMode( EQueryResultModeItem ); + + CMdELogicCondition& conditions = iQuery->Conditions(); + ExcludeMusicPropertiesL( conditions ); + iIsQuerying = ETrue; + iQuery->FindL(); + } + +void CToneSelection::LeaveIfSessionClosedL() + { + if ( !iSession || !iSessionOpen ) + { + User::Leave( KErrDisconnected ); + } + } + +CMdEPropertyDef& CToneSelection::PropertyDefL( TInt aAttr ) + { + return PropertyDefL( iSession, aAttr ); + } + +CMdEPropertyDef& CToneSelection::PropertyDefL( CMdESession* aSession, TInt aAttr ) + { + CMdEObjectDef& objectDef = + iDefNS->GetObjectDefL( MdeConstants::Audio::KAudioObject ); + + if ( aAttr == EAttrFileSize ) + { + return objectDef.GetPropertyDefL( MdeConstants::Object::KSizeProperty ); + } + else if ( aAttr == EAttrMediaType ) + { + return objectDef.GetPropertyDefL( MdeConstants::Object::KItemTypeProperty ); + } + else if ( aAttr == EAttrSongName || aAttr == EAttrFileName ) + { + return objectDef.GetPropertyDefL( MdeConstants::Object::KTitleProperty ); + } + else if ( aAttr == EAttrArtist ) + { + return objectDef.GetPropertyDefL( MdeConstants::MediaObject::KArtistProperty ); + } + else if ( aAttr == EAttrAlbum ) + { + return objectDef.GetPropertyDefL( MdeConstants::Audio::KAlbumProperty ); + } + else if ( aAttr == EAttrGenre ) + { + return objectDef.GetPropertyDefL( MdeConstants::MediaObject::KGenreProperty ); + } + else if ( aAttr == EAttrComposer ) + { + return objectDef.GetPropertyDefL( MdeConstants::Audio::KComposerProperty ); + } + else + { + User::Leave( KErrNotSupported ); + } + } + +void CToneSelection::ExcludeMusicPropertiesL( CMdELogicCondition& aCondition ) + { + TInt sizeLimitKB = 0; + CRepository* cenrep = CRepository::NewL( KCRUidProfileEngine ); + CleanupStack::PushL( cenrep ); + User::LeaveIfError( cenrep->Get( KProEngRingingToneMaxSize, sizeLimitKB ) ); + CleanupStack::PopAndDestroy(); // cenrep + + SetAttr( CToneSelection::EAttrFileSize, sizeLimitKB ); + CMdEPropertyDef& sizeTypeDef = PropertyDefL( EAttrFileSize ); + CMdEPropertyDef& mimeTypeDef = PropertyDefL( EAttrMediaType ); + CMdEPropertyDef& artistTypeDef = PropertyDefL( EAttrArtist ); + CMdEPropertyDef& albumTypeDef = PropertyDefL( EAttrAlbum ); + CMdEPropertyDef& genreTypeDef = PropertyDefL( EAttrGenre ); + CMdEPropertyDef& composerTypeDef = PropertyDefL( EAttrComposer ); + + CMdELogicCondition& condition = + aCondition.AddLogicConditionL( ELogicConditionOperatorAnd ); + condition.AddPropertyConditionL( sizeTypeDef, TMdEIntRange(0, iMaxFileSize, EMdERangeTypeBetween) ); + condition.AddPropertyConditionL( mimeTypeDef, + ETextPropertyConditionCompareContains, KMimeMp3 ); + condition.AddPropertyConditionL( artistTypeDef ); + condition.AddPropertyConditionL( albumTypeDef ); + condition.AddPropertyConditionL( genreTypeDef ); + condition.AddPropertyConditionL( composerTypeDef ); + + condition.SetNegate( ETrue ); + } + +void CToneSelection::SetAttr( int attr, int value ) +{ + switch ( attr ) + { + case CToneSelection::EAttrFileSize: + { + iMaxFileSize = value; + break; + } + default: + { + break; + } + } +} + +void CToneSelection::ChangeObject() + { + if ( QueryReady() ) + { + iToneSelectionWatcher->HandleObjectChanged(); + } + } + +TBool CToneSelection::QueryReady() + { + if ( iQuery ) + { + return iQuery->IsComplete(); + } + + return ETrue; + } +// End of File +