diff -r 000000000000 -r a2952bb97e68 mmappcomponents/audiofetcher/src/audiofetcherfilehandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmappcomponents/audiofetcher/src/audiofetcherfilehandler.cpp Thu Dec 17 08:55:47 2009 +0200 @@ -0,0 +1,1419 @@ +/* +* Copyright (c) 2007 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 "audiofetcherfilehandler.h" +#include "audiofetcherlog.h" + +#include +#include + + +/****************************************************************************** + * class CAudioFetcherFileHandler + ******************************************************************************/ + + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::NewL +// +// ----------------------------------------------------------------------------- +// +CAudioFetcherFileHandler* CAudioFetcherFileHandler::NewL() + { + CAudioFetcherFileHandler* self = new (ELeave) CAudioFetcherFileHandler(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + + +// ----------------------------------------------------------------------------- +// Destructor +// +// ----------------------------------------------------------------------------- +// +CAudioFetcherFileHandler::~CAudioFetcherFileHandler() + { + WLOG("CAudioFetcherFileHandler::~CAudioFetcherFileHandler >"); + + if ( iSearchList ) + { + iSearchList->Reset(); + } + delete iSearchList; + delete iQueryCaller; + delete iObjectNotificationCaller; + + delete iDriveUtil; + WLOG("CAudioFetcherFileHandler::~CAudioFetcherFileHandler before iQuery"); + if ( iQuery ) + { + iQuery->Cancel(); + } + delete iQuery; + WLOG("CAudioFetcherFileHandler::~CAudioFetcherFileHandler after iQuery"); + delete iSession; + WLOG("CAudioFetcherFileHandler::~CAudioFetcherFileHandler <"); + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::CAudioFetcherFileHandler +// +// ----------------------------------------------------------------------------- +// +CAudioFetcherFileHandler::CAudioFetcherFileHandler() + { + iSessionOpen = EFalse; + iObserverCallEnabled = ETrue; + + iMaxFileSize = KErrNotFound; + iQueryId = KErrNotFound; + iQueryType = KErrNotFound; + iQueryError = KErrNone; + iQueryEvent = KErrNotFound; + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::ConstructL +// +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::ConstructL() + { + WLOG("CAudioFetcherFileHandler::ConstructL >"); + + iSession = CMdESession::NewL( *this ); + iSearchList = CSearchList::NewL(); + + iQueryCaller = CActiveCaller::NewL( this ); + iObjectNotificationCaller = CActiveCaller::NewL( this ); + + iDriveUtil = CDriveUtil::NewL(); + + WLOG("CAudioFetcherFileHandler::ConstructL <"); + } + + + + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::HandleSessionOpened (from MMdESessionObserver) +// +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::HandleSessionOpened( CMdESession& /*aSession*/, TInt aError ) + { + WLOG("CAudioFetcherFileHandler::HandleSessionOpened >"); + if ( aError != KErrNone ) + { + delete iSession; + iSession = NULL; + iSessionOpen = EFalse; + } + else + { + iSessionOpen = ETrue; + + TRAP_IGNORE( AddObjectObserverL() ); + } + + CallObserver( MAudioFetcherFileHandlerObserver::EInitComplete, aError ); + WLOG("CAudioFetcherFileHandler::HandleSessionOpened <"); + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::AddObjectObserverL +// +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::AddObjectObserverL() + { + WLOG("CAudioFetcherFileHandler::AddObjectObserverL >"); + if ( iSessionOpen ) + { + TUint32 notificationType = ENotifyAdd | ENotifyModify | ENotifyRemove; + CMdENamespaceDef& defNS = iSession->GetDefaultNamespaceDefL(); + iSession->AddObjectObserverL( *this, NULL, notificationType, &defNS ); + + iSession->AddObjectPresentObserverL( *this ); + } + WLOG("CAudioFetcherFileHandler::AddObjectObserverL <"); + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::HandleSessionError (from MMdESessionObserver) +// +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::HandleSessionError( CMdESession& /*aSession*/, TInt aError ) + { + WLOG("CAudioFetcherFileHandler::HandleSessionError >"); + if ( aError == KErrNone ) + { + return; + } + + delete iSession; + iSession = NULL; + iSessionOpen = EFalse; + + CallObserver( MAudioFetcherFileHandlerObserver::EError, aError ); + WLOG("CAudioFetcherFileHandler::HandleSessionError <"); + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::HandleQueryNewResults (from MMdEQueryObserver) +// +// This observer function is called during query. Calling frequency is defined +// in second parameter of CMdEQuery::FindL. +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::HandleQueryNewResults( CMdEQuery& /*aQuery*/, + TInt /*aFirstNewItemIndex*/, + TInt /*aNewItemCount*/ ) + { + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::HandleObjectNotification (MMdEObjectObserver) +// +// Called when metadata database changes. +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::HandleObjectNotification( CMdESession& /*aSession*/, + TObserverNotificationType aType, + const RArray& aObjectIdArray ) + { + WLOG("CAudioFetcherFileHandler::HandleObjectNotification >"); + if ( aType == ENotifyAdd || aType == ENotifyModify || aType == ENotifyRemove ) + { + if ( iObserver ) + { + TInt count = aObjectIdArray.Count(); + WLOG1("CAudioFetcherFileHandler::HandleObjectNotification: count is %d", count ); + + // delayed call to avoid many consecutive observer calls + CallObserverWithDelay(); + } + } + WLOG("CAudioFetcherFileHandler::HandleObjectNotification <"); + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::HandleObjectPresentNotification (MMdEObjectPresentObserver) +// +// Called when previously used memory card is inserted and hidden +// metadata files are made present again. +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::HandleObjectPresentNotification( CMdESession& /*aSession*/, + TBool /*aPresent*/, const RArray& aObjectIdArray ) + { + WLOG("CAudioFetcherFileHandler::HandleObjectPresentNotification >"); + if ( iObserver ) + { + TInt count = aObjectIdArray.Count(); + WLOG1("CAudioFetcherFileHandler::HandleObjectPresentNotification: count is %d", count ); + + // delayed call to avoid many consecutive observer calls + CallObserverWithDelay(); + } + WLOG("CAudioFetcherFileHandler::HandleObjectPresentNotification <"); + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::HandleQueryCompleted (MMdEQueryObserver) +// +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::HandleQueryCompleted( CMdEQuery& aQuery, TInt aError ) + { + WLOG("CAudioFetcherFileHandler::HandleQueryCompleted >"); + TInt err = KErrNone; + TRAP( err, HandleQueryCompletedL( aQuery, aError ) ); + + if ( err == KErrCancel ) + { + CallObserver( MAudioFetcherFileHandlerObserver::EQueryCanceled, KErrNone ); + } + else if ( err != KErrNone ) + { + iSearchList->Reset(); + CallObserver( MAudioFetcherFileHandlerObserver::EError, err ); + } + WLOG("CAudioFetcherFileHandler::HandleQueryCompleted <"); + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::HandleQueryCompletedL +// +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::HandleQueryCompletedL( CMdEQuery& /*aQuery*/, TInt aError ) + { + WLOG("CAudioFetcherFileHandler::HandleQueryCompletedL >"); + TInt err = aError; + + if ( !iQuery ) + { + err = KErrGeneral; + } + if ( err == KErrCancel ) + { + iSearchList->Reset(); + return; +// User::Leave( err ); + } + if ( err != KErrNone ) + { + User::Leave( err ); + } + + iSearchList->SetSession( iSession ); + TQueryResultMode resultMode = iQuery->ResultMode(); + + if ( resultMode == EQueryResultModeCount ) + { + // EQueryResultModeCount currently not used + CallObserver( MAudioFetcherFileHandlerObserver::EUnknownQueryComplete, KErrNone ); + } + else if ( resultMode == EQueryResultModeItem ) + { + if ( iQueryType == ESearchAudio ) + { + // ESearchAudio currently not used + iSearchList->Reset(); + iSearchList->TakeResultL( iQuery, EMediaTypeMusic ); + } + else if ( iQueryType == ESearchMusic ) + { + // search is done in 3 steps (music, tones and videos) + iSearchList->Reset(); + iSearchList->TakeResultL( iQuery, EMediaTypeMusic ); + } + else if ( iQueryType == ESearchTones ) + { + iSearchList->TakeResultL( iQuery, EMediaTypeTone ); + } + else if ( iQueryType == EQueryUnknown ) + { + iSearchList->Reset(); + iSearchList->TakeResultL( iQuery, EMediaTypeMusic ); + iSearchList->SetSearchId( iQueryId ); + + CallObserver( MAudioFetcherFileHandlerObserver::EUnknownQueryComplete, KErrNone ); + } + else + { + TInt mediaType = MediaType( iQueryType ); + iSearchList->TakeResultL( iQuery, mediaType ); + iSearchList->SetSearchId( iQueryId ); + iSearchList->Sort(); + + CallObserver( MAudioFetcherFileHandlerObserver::EQueryComplete, KErrNone ); + } + } + else + { + CallObserver( MAudioFetcherFileHandlerObserver::EError, KErrNotSupported ); + } + WLOG("CAudioFetcherFileHandler::HandleQueryCompletedL <"); + } + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::EQueryImage +// +// Finds image files. +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::QueryImageL() + { + WLOG("CAudioFetcherFileHandler::EQueryImageL >"); + + LeaveIfSessionClosedL(); + + CMdENamespaceDef& defNS = iSession->GetDefaultNamespaceDefL(); + CMdEObjectDef& imageObjectDef = + defNS.GetObjectDefL( MdeConstants::Image::KImageObject ); + + delete iQuery; + iQuery = NULL; + iQuery = iSession->NewObjectQueryL( defNS, imageObjectDef, this ); + + // set attributes that are included in query result + CMdEPropertyDef& namePropertyDef = PropertyDefL( EAttrSongName ); + iQuery->AddPropertyFilterL( &namePropertyDef ); + CMdEPropertyDef& fileTypePropertyDef = PropertyDefL( EAttrMediaType ); + iQuery->AddPropertyFilterL( &fileTypePropertyDef ); + + CMdELogicCondition& conditions = iQuery->Conditions(); + ExcludeRomFilesL( conditions ); + + iQuery->SetResultMode( EQueryResultModeItem ); + iQuery->FindL(); + + iQueryType = EMediaTypeImage; + + WLOG("CAudioFetcherFileHandler::QueryImageL <"); + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::QueryAudioL +// +// Finds music files. +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::QueryAudioL() + { + WLOG("CAudioFetcherFileHandler::QueryAudioL >"); + + LeaveIfSessionClosedL(); + + CMdENamespaceDef& defNS = iSession->GetDefaultNamespaceDefL(); + CMdEObjectDef& musicObjectDef = + defNS.GetObjectDefL( MdeConstants::Audio::KAudioObject ); + + delete iQuery; + iQuery = NULL; + iQuery = iSession->NewObjectQueryL( defNS, musicObjectDef, this ); + + // set attributes that are included in query result + CMdEPropertyDef& namePropertyDef = PropertyDefL( EAttrSongName ); + iQuery->AddPropertyFilterL( &namePropertyDef ); + CMdEPropertyDef& fileTypePropertyDef = PropertyDefL( EAttrMediaType ); + iQuery->AddPropertyFilterL( &fileTypePropertyDef ); + + CMdELogicCondition& conditions = iQuery->Conditions(); + ExcludeRomFilesL( conditions ); + + // define sort order + // iQuery->AppendOrderRuleL( TMdEOrderRule( namePropertyDef, ESortAscending ) ); + + iQuery->SetResultMode( EQueryResultModeItem ); + iQuery->FindL(); + + iQueryType = EMediaTypeMusic; + + WLOG("CAudioFetcherFileHandler::QueryAudioL <"); + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::QueryAudioL +// +// Finds music files. +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::QueryVideoL() + { + WLOG("CAudioFetcherFileHandler::QueryVideoL >"); + + LeaveIfSessionClosedL(); + + CMdENamespaceDef& defNS = iSession->GetDefaultNamespaceDefL(); + CMdEObjectDef& videoObjectDef = + defNS.GetObjectDefL( MdeConstants::Video::KVideoObject ); + + delete iQuery; + iQuery = NULL; + iQuery = iSession->NewObjectQueryL( defNS, videoObjectDef, this ); + + // set attributes that are included in query result + CMdEPropertyDef& namePropertyDef = PropertyDefL( EAttrSongName ); + iQuery->AddPropertyFilterL( &namePropertyDef ); + CMdEPropertyDef& fileTypePropertyDef = PropertyDefL( EAttrMediaType ); + iQuery->AddPropertyFilterL( &fileTypePropertyDef ); + + CMdELogicCondition& conditions = iQuery->Conditions(); + ExcludeRomFilesL( conditions ); + + iQuery->SetResultMode( EQueryResultModeItem ); + iQuery->FindL(); + + iQueryType = EMediaTypeVideo; + + WLOG("CAudioFetcherFileHandler::QueryVideoL <"); + } + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::ResultCount +// +// ----------------------------------------------------------------------------- +// +TInt CAudioFetcherFileHandler::ResultCount() + { + WLOG("CAudioFetcherFileHandler::ResultCount"); + if ( !iSessionOpen ) + { + return 0; + } + + return iSearchList->Count(); + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::CancelQuery +// +// Cancels ongoing query. +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::CancelQuery() + { + WLOG("CAudioFetcherFileHandler::CancelQuery >"); + if ( !iSessionOpen || !iQuery ) + { + return; + } + + if ( !iQuery->IsComplete() ) + { + iQuery->Cancel(); // this calls HandleQueryCompleted synchronously + } + WLOG("CAudioFetcherFileHandler::CancelQuery <"); + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::LeaveIfSessionClosedL +// +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::LeaveIfSessionClosedL() + { + WLOG("CAudioFetcherFileHandler::LeaveIfSessionClosedL >"); + if ( !iSession || !iSessionOpen ) + { + User::Leave( KErrDisconnected ); + } + WLOG("CAudioFetcherFileHandler::LeaveIfSessionClosedL <"); + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::SetObserver +// +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::SetObserver( MAudioFetcherFileHandlerObserver* aObserver ) + { + iObserver = aObserver; + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::GetAttributeL +// +// NOTE: GetAttributeL only gets full name or file name +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::GetAttributeL( TInt aIndex, TInt aAttr, + TDes& aValue, TInt aQueryId ) + { + WLOG("CAudioFetcherFileHandler::GetAttributeL"); + aValue = KNullDesC; + + if ( !iSessionOpen ) + { + return; + } + + TInt id = iSearchList->SearchId(); + if ( id != aQueryId ) + { + return; // search list and UI do not match + } + + iSearchList->SetSession( iSession ); + iSearchList->GetAttributeL( aIndex, aAttr, aValue ); + } + + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::GetAttribute +// +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::GetAttribute( TInt aIndex, TInt aAttr, + TDes& aValue, TInt aQueryId ) + { + WLOG("CAudioFetcherFileHandler::GetAttribute"); + TRAP_IGNORE( GetAttributeL( aIndex, aAttr, aValue, aQueryId ) ); + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::Attribute +// +// ----------------------------------------------------------------------------- +// +TInt CAudioFetcherFileHandler::Attribute( TInt aIndex, TInt aAttr, TInt aQueryId ) + { + WLOG("CAudioFetcherFileHandler::Attribute"); + if ( !iSessionOpen ) + { + return KErrNotFound; + } + + TInt id = iSearchList->SearchId(); + if ( id != aQueryId ) + { + return KErrNotFound; + } + + return iSearchList->Attribute( aIndex, aAttr ); + } + + + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::PropertyDefL +// +// ----------------------------------------------------------------------------- +// +CMdEPropertyDef& CAudioFetcherFileHandler::PropertyDefL( TInt aAttr ) + { + WLOG("CAudioFetcherFileHandler::PropertyDefL"); + return PropertyDefL( iSession, aAttr ); + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::PropertyDefL +// +// ----------------------------------------------------------------------------- +// +CMdEPropertyDef& CAudioFetcherFileHandler::PropertyDefL( CMdESession* aSession, TInt aAttr ) + { + WLOG("CAudioFetcherFileHandler::PropertyDefL"); + CMdENamespaceDef& defNS = aSession->GetDefaultNamespaceDefL(); + + CMdEObjectDef& objectDef = + defNS.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 ); + } + + return objectDef.GetPropertyDefL( MdeConstants::Object::KTitleProperty ); + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::QueryReady +// +// ----------------------------------------------------------------------------- +// +TBool CAudioFetcherFileHandler::QueryReady() + { + WLOG("CAudioFetcherFileHandler::QueryReady"); + + TBool isWaitingObserverCall = iQueryCaller->IsActive(); + if ( isWaitingObserverCall ) + { + return EFalse; // query is ready but observer not called yet + } + + if ( iQuery ) + { + return iQuery->IsComplete(); + } + + return ETrue; + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::ExcludeRomFilesL +// +// Exclude audio files that are in rom (default tones). +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::ExcludeRomFilesL( CMdELogicCondition& aCondition ) + { + WLOG("CAudioFetcherFileHandler::ExcludeRomFilesL"); + _LIT( KDriveZ, "z:\\" ); + + CMdEObjectCondition& cond = aCondition.AddObjectConditionL( + EObjectConditionCompareUriBeginsWith, KDriveZ ); + cond.SetNegate( ETrue ); + } + + +// ------------------------------------------------------------------------------- +// CAudioFetcherFileHandler::StrCopy +// +// String copy with lenght check. +// ------------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::StrCopy( TDes& aTarget, const TDesC& aSource ) + { + WLOG("CAudioFetcherFileHandler::StrCopy"); + TInt len = aTarget.MaxLength(); + if( len < aSource.Length() ) + { + aTarget.Copy( aSource.Left( len ) ); + return; + } + aTarget.Copy( aSource ); + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::EnableObserverCall +// +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::EnableObserverCall( TBool aEnable ) + { + iObserverCallEnabled = aEnable; + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::CallObserver +// +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::CallObserver( TInt aEvent, TInt aError ) + { + WLOG("CAudioFetcherFileHandler::CallObserver"); + const TInt KDelay = 100; // milliseconds + + if ( !iObserverCallEnabled ) + { + return; + } + + iQueryError = aError; + iQueryEvent = aEvent; + + iQueryCaller->Start( 0, KDelay ); + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::CallObserverWithDelay +// +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::CallObserverWithDelay() + { + WLOG("CAudioFetcherFileHandler::CallObserverWithDelay"); + const TInt KOneSecond = 1000; + + if ( !iObserverCallEnabled ) + { + return; + } + + iObjectNotificationCaller->Start( 1, KOneSecond ); + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::HandleActiveCallL (from MActiveCallerObserver) +// +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::HandleActiveCallL( TInt aCallId ) + { + WLOG("CAudioFetcherFileHandler::HandleActiveCallL"); + if ( !iObserver ) + { + return; + } + + // inform observer that query is ready + if ( aCallId == 0 ) + { + TRAP_IGNORE( iObserver->HandleFileEventL( iQueryEvent, iQueryError ) ); + } + + // inform observer that database has changed + if ( aCallId == 1 ) + { + if ( QueryReady() ) + { + TRAP_IGNORE( iObserver->HandleFileEventL( MAudioFetcherFileHandlerObserver::EMediaFileChanged, KErrNone ) ); + } + } + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::SetQueryId +// +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::SetQueryId( TInt aId ) + { + // this id is passed to CSearchList after successful database search + iQueryId = aId; + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::Panic +// +// ----------------------------------------------------------------------------- +// +void CAudioFetcherFileHandler::Panic( TInt aReason ) + { + _LIT( KPanicCategory, "CAudioFetcherFileHandler" ); + + User::Panic( KPanicCategory, aReason ); + } + + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::MediaType +// +// ----------------------------------------------------------------------------- +// +TInt CAudioFetcherFileHandler::MediaType( TInt aQueryType ) + { + TInt mediaType = EMediaTypeAny; + + if ( aQueryType == EMediaTypeMusic ) + { + mediaType = EMediaTypeMusic; + } + else if ( aQueryType == EMediaTypeImage ) + { + mediaType = EMediaTypeImage; + } + else if ( aQueryType == EMediaTypeVideo ) + { + mediaType = EMediaTypeVideo; + } + return mediaType; + } + +// ----------------------------------------------------------------------------- +// CAudioFetcherFileHandler::QueryType +// +// ----------------------------------------------------------------------------- +// +TInt CAudioFetcherFileHandler::QueryType() + { + return iQueryType; + } + + +/****************************************************************************** + * class CSearchListItem + ******************************************************************************/ + + +// ----------------------------------------------------------------------------- +// CSearchListItem::NewL +// +// ----------------------------------------------------------------------------- +// +CSearchListItem* CSearchListItem::NewLC() + { + CSearchListItem* self = new (ELeave) CSearchListItem(); + CleanupStack::PushL( self ); + self->ConstructL(); + + return self; + } + + +// ----------------------------------------------------------------------------- +// Destructor +// +// ----------------------------------------------------------------------------- +// +CSearchListItem::~CSearchListItem() + { + delete iTitle; + } + + +// ----------------------------------------------------------------------------- +// CSearchListItem::CSearchListItem +// +// ----------------------------------------------------------------------------- +// +CSearchListItem::CSearchListItem() + { + iId = KErrNotFound; + iMediaType = KErrNotFound; + iStorageType = KErrNotFound; + iTitle = NULL; + } + + +// ----------------------------------------------------------------------------- +// CSearchListItem::ConstructL +// +// ----------------------------------------------------------------------------- +// +void CSearchListItem::ConstructL() + { + } + +// ----------------------------------------------------------------------------- +// CSearchListItem::SetTitleL +// +// ----------------------------------------------------------------------------- +// + +void CSearchListItem::SetTitleL( const TDesC& aText, TBool aFullName ) + { + delete iTitle; + iTitle = NULL; + + if ( aFullName ) + { + TParsePtrC parse( aText ); + iTitle = parse.Name().AllocL(); + } + else + { + iTitle = aText.AllocL(); + } + } + + +// ----------------------------------------------------------------------------- +// CSearchListItem::Title +// +// ----------------------------------------------------------------------------- +// + +const TDesC& CSearchListItem::Title() const + { + return *iTitle; + } + + + + +/****************************************************************************** + * class CSearchList + ******************************************************************************/ + + +// ----------------------------------------------------------------------------- +// CSearchList::NewL +// +// ----------------------------------------------------------------------------- +// +CSearchList* CSearchList::NewL() + { + CSearchList* self = new (ELeave) CSearchList(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + + +// ----------------------------------------------------------------------------- +// Destructor +// +// ----------------------------------------------------------------------------- +// +CSearchList::~CSearchList() + { + WLOG("CSearchList::~CSearchList >"); + iList.ResetAndDestroy(); + delete iDriveUtil; + WLOG("CSearchList::~CSearchList <"); + } + + +// ----------------------------------------------------------------------------- +// CSearchList::CSearchList +// +// ----------------------------------------------------------------------------- +// +CSearchList::CSearchList() + { + iSearchId = KErrNotFound; + } + + +// ----------------------------------------------------------------------------- +// CSearchList::ConstructL +// +// ----------------------------------------------------------------------------- +// +void CSearchList::ConstructL() + { + WLOG("CSearchList::ConstructL >"); + iDriveUtil = CDriveUtil::NewL(); + WLOG("CSearchList::ConstructL"); + } + + +// ----------------------------------------------------------------------------- +// CSearchList::SetSession +// +// ----------------------------------------------------------------------------- +// +void CSearchList::SetSession( CMdESession* aSession ) + { + iSession = aSession; + } + + +// ----------------------------------------------------------------------------- +// CSearchList::SetSearchId +// +// ----------------------------------------------------------------------------- +// +void CSearchList::SetSearchId( TInt aSearchId ) + { + iSearchId = aSearchId; + } + + +// ----------------------------------------------------------------------------- +// CSearchList::SearchId +// +// ----------------------------------------------------------------------------- +// +TInt CSearchList::SearchId() + { + return iSearchId; + } + + +// ----------------------------------------------------------------------------- +// CSearchList::TakeResultL +// +// ----------------------------------------------------------------------------- +// +void CSearchList::TakeResultL( CMdEObjectQuery* aQuery, TInt aMediaType ) + { + WLOG("CSearchList::TakeResultL >"); + if ( !aQuery ) + { + return; + } + + TInt count = aQuery->Count(); + + for ( TInt i=0; iTakeOwnershipOfResult( i ); + CleanupStack::PushL( object ); + AddItemL( *object, aMediaType ); + CleanupStack::PopAndDestroy( object ); + } + WLOG("CSearchList::TakeResultL <"); + } + +// ----------------------------------------------------------------------------- +// CSearchList::TakeDistinctResultL +// +// ----------------------------------------------------------------------------- +// +void CSearchList::TakeDistinctResultL( CMdEObjectQuery* aQuery, + TInt /*aMediaType*/ ) + { + if ( !aQuery ) + { + return; + } + + TInt count = aQuery->Count(); + + for ( TInt i=0; iResultDistinctValue( i ); + + CSearchListItem* item = CSearchListItem::NewLC(); + + item->SetTitleL( ptr, EFalse ); + item->iMediaType = KErrNotFound; + item->iStorageType = KErrNotFound; + + iList.AppendL( item ); + + CleanupStack::Pop( item ); + } + } + + +// ----------------------------------------------------------------------------- +// CSearchList::AddItemL +// +// ----------------------------------------------------------------------------- +// +void CSearchList::AddItemL( CMdEObject& aObject, TInt aMediaType ) + { + WLOG("CSearchList::AddItemL >"); + CSearchListItem* item = CSearchListItem::NewLC(); + + TPtrC songName = TextL( aObject, CAudioFetcherFileHandler::EAttrSongName ); + + if ( songName.Length() > 0 ) + { + item->SetTitleL( songName, EFalse ); + } + else + { + item->SetTitleL( aObject.Uri(), ETrue ); + } + + + item->iId = aObject.Id(); + item->iMediaType = aMediaType; + + TInt storageType = CAudioFetcherFileHandler::EPhoneMemory; + if ( iDriveUtil->IsMemoryCard( aObject.Uri() ) ) + { + storageType = CAudioFetcherFileHandler::EMemoryCard; + } + else if ( iDriveUtil->IsMassStorage( aObject.Uri() ) ) + { + storageType = CAudioFetcherFileHandler::EMassStorage; + } + item->iStorageType = storageType; + + iList.AppendL( item ); + + CleanupStack::Pop( item ); + WLOG("CSearchList::AddItemL <"); + } + + +// ----------------------------------------------------------------------------- +// CSearchList::AddAlbumItemL +// +// ----------------------------------------------------------------------------- +// +void CSearchList::AddAlbumItemL( const TDesC& aAlbum ) + { + TLinearOrder sortFunction( CSearchList::Compare ); + + CSearchListItem* item = CSearchListItem::NewLC(); + + item->SetTitleL( aAlbum, EFalse ); + + CleanupStack::Pop( item ); + + item->iMediaType = KErrNotFound; + item->iStorageType = KErrNotFound; + item->iId = KErrNotFound; + + TInt err = iList.InsertInOrder( item, sortFunction ); + if ( err != KErrNone ) + { + delete item; + } + if ( err != KErrNone && err != KErrAlreadyExists ) + { + User::Leave( err ); + } + } + + +// ----------------------------------------------------------------------------- +// CSearchList::AddArtistItemL +// +// ----------------------------------------------------------------------------- +// +void CSearchList::AddArtistItemL( CMdEObject& aObject, + TInt aQueryType, const TDesC& aAlbum ) + { + // all songs for one artist + if ( aQueryType == CAudioFetcherFileHandler::EQueryArtistAll ) + { + AddItemL( aObject, CAudioFetcherFileHandler::EMediaTypeMusic ); + return; + } + + TPtrC album = TextL( aObject, CAudioFetcherFileHandler::EAttrAlbum ); + + // unknown songs (no album metadata) for one artist + if ( aQueryType == CAudioFetcherFileHandler::EQueryArtistUnknown ) + { + if ( album.Length() == 0 ) + { + AddItemL( aObject, CAudioFetcherFileHandler::EMediaTypeMusic ); + } + } + + // all albums for one artist + if ( aQueryType == CAudioFetcherFileHandler::EQueryArtist ) + { + if ( album.Length() > 0 ) + { + AddAlbumItemL( album ); + } + } + + // songs in one album + if ( aQueryType == CAudioFetcherFileHandler::EQueryArtistAlbum ) + { + if ( album.Length() > 0 ) + { + if ( album.Compare( aAlbum ) == 0 ) + { + AddItemL( aObject, CAudioFetcherFileHandler::EMediaTypeMusic ); + } + } + } + } + + +// ----------------------------------------------------------------------------- +// CSearchList::Sort +// +// ----------------------------------------------------------------------------- +// +void CSearchList::Sort() + { + iList.Sort( TLinearOrder(CSearchList::Compare) ); + } + + +// ----------------------------------------------------------------------------- +// CSearchList::Reset +// +// ----------------------------------------------------------------------------- +// +void CSearchList::Reset() + { + iSearchId = KErrNotFound; + iList.ResetAndDestroy(); + } + + +// ----------------------------------------------------------------------------- +// CSearchList::Count +// +// ----------------------------------------------------------------------------- +// +TInt CSearchList::Count() + { + WLOG("CSearchList::Count"); + return iList.Count(); + } + + +// ----------------------------------------------------------------------------- +// CSearchList::GetAttributeL +// +// ----------------------------------------------------------------------------- +// +void CSearchList::GetAttributeL( TInt aIndex, TInt aAttr, TDes& aValue ) + { + WLOG("CSearchList::GetAttributeL"); + aValue = KNullDesC; + + if ( !iSession ) + { + return; + } + + if ( aIndex == KErrNotFound ) + { + return; + } + + TInt count = iList.Count(); + __ASSERT_ALWAYS( aIndex >= 0 && aIndex < count, Panic( KErrGeneral ) ); + + if ( aAttr == CAudioFetcherFileHandler::EAttrFullName ) + { + CSearchListItem* item = iList[aIndex]; + CMdEObject* object = iSession->GetFullObjectL( item->iId ); + CleanupStack::PushL( object ); + StrCopy( aValue, object->Uri() ); + CleanupStack::PopAndDestroy( object ); + } + + else if ( aAttr == CAudioFetcherFileHandler::EAttrSongName || + aAttr == CAudioFetcherFileHandler::EAttrFileName ) + { + CSearchListItem* item = iList[aIndex]; + StrCopy( aValue, item->Title() ); + if ( aValue.Length() == 0 ) + { + CMdEObject* object = iSession->GetFullObjectL( item->iId ); + CleanupStack::PushL( object ); + TParsePtrC parse( object->Uri() ); + StrCopy( aValue, parse.Name() ); + CleanupStack::PopAndDestroy( object ); + } + } + } + + +// ----------------------------------------------------------------------------- +// CSearchList::Attribute +// +// ----------------------------------------------------------------------------- +// +TInt CSearchList::Attribute( TInt aIndex, TInt aAttr ) + { + WLOG("CSearchList::Attribute"); + if ( aIndex == KErrNotFound ) + { + return KErrNotFound; + } + + TInt count = iList.Count(); + __ASSERT_ALWAYS( aIndex >= 0 && aIndex < count, Panic( KErrGeneral ) ); + + + TInt ret = KErrNotFound; + if ( aAttr == CAudioFetcherFileHandler::EAttrMediaType ) + { + CSearchListItem* item = iList[aIndex]; + ret = item->iMediaType; + } + + else if ( aAttr == CAudioFetcherFileHandler::EAttrStorageType ) + { + CSearchListItem* item = iList[aIndex]; + ret = item->iStorageType; + } + else if ( aAttr == CAudioFetcherFileHandler::EAttrMediaFileId ) + { + CSearchListItem* item = iList[aIndex]; + ret = item->iId; + } + + return ret; + } + + +// ----------------------------------------------------------------------------- +// CSearchList::Compare +// +// ----------------------------------------------------------------------------- +// +TInt CSearchList::Compare( const CSearchListItem& aFirst, + const CSearchListItem& aSecond ) + { + TPtrC first = aFirst.Title(); + TPtrC second = aSecond.Title(); + + return first.Compare( second ); + } + +// ----------------------------------------------------------------------------- +// CSearchList::StrCopy +// +// ----------------------------------------------------------------------------- +// +void CSearchList::StrCopy( TDes& aTarget, const TDesC& aSource ) + { + WLOG("CSearchList::StrCopy >"); + TInt len = aTarget.MaxLength(); + if( len < aSource.Length() ) + { + aTarget.Copy( aSource.Left(len) ); + return; + } + aTarget.Copy( aSource ); + WLOG("CSearchList::StrCopy <"); + } + +// ----------------------------------------------------------------------------- +// CSearchList::Panic +// +// ----------------------------------------------------------------------------- +// +void CSearchList::Panic( TInt aReason ) + { + _LIT( KPanicCategory, "CSearchList" ); + + User::Panic( KPanicCategory, aReason ); + } + + +// ----------------------------------------------------------------------------- +// CSearchList::TextL +// +// ----------------------------------------------------------------------------- +// +const TDesC& CSearchList::TextL( CMdEObject& aObject, TInt aId ) + { + WLOG("CSearchList::TextL"); + CMdEPropertyDef& propDef = + CAudioFetcherFileHandler::PropertyDefL( iSession, aId ); + + CMdEProperty* property = NULL; + TInt err = aObject.Property( propDef, property, 0 ); + + if ( err != KErrNotFound && property ) + { + return property->TextValueL(); + } + + return KNullDesC; + } + + +// End of File