void MsgAudioSelectionEngine::HandleQueryCompletedL(CMdEQuery& aQuery,
        TInt aError)
    {
    iNameList.clear();
    iUriList.clear();
    if (aError == KErrCancel)
        {
        emit queryError(aError);
        return;
        }
    else
        {
        QMap<QString,QString> nameUriList;
        CMdEObjectQuery* query = static_cast<CMdEObjectQuery*> (&aQuery);
        TInt count = query->Count();
        for (TInt i = 0; i < count; ++i)
            {
            CMdEObject* object =
                    (CMdEObject*) query->TakeOwnershipOfResult(i);
            CleanupStack::PushL(object);
            CMdEPropertyDef& propDef = MsgAudioSelectionEngine::PropertyDefL(
                    iSession, MsgAudioSelectionEngine::EAttrFileName);

            CMdEProperty* property = 0;
            TInt err = object->Property(propDef, property, 0);
            if (err != KErrNotFound && property)
                {
                QString songName(XQConversions::s60DescToQString(
                        property->TextValueL()));
                QString uriValue(XQConversions::s60DescToQString(
                        object->Uri()));
                
                //insert into the map
                nameUriList.insertMulti(uriValue, songName);
                }
            CleanupStack::PopAndDestroy(object);
            }
        
        //now get all the song names and sort them
        iNameList = nameUriList.values();
        iNameList.sort();
        
        // go through the song list and get the associated uri
        // insert into the uri list
        int nameListTotal = iNameList.count();
        for(int nameListCount = 0; 
                nameListCount<nameListTotal;
                nameListCount++)
            {
            QString key = nameUriList.key(iNameList.at(nameListCount));
            iUriList.append(key);
            nameUriList.remove(key);                        
            }
        
        // emit the list to the model
        emit queryComplete(iNameList, iUriList);
        }
    }
// -----------------------------------------------------------------------------
// CContextEnginePluginTest::MultipleSnapshots
// -----------------------------------------------------------------------------
//
TInt CContextEnginePluginTest::MultipleSnapshotsL( CStifItemParser& aItem )
    {
    _LIT( KMsg1, "Enter MultipleSnapshots" );
    iLog->Log( KMsg1 );  
    RDebug::Print( KMsg1 );
    
    iSnapshotTarget = 3;
    
    TInt count = iIds.Count();
    
    CMdEObject* mdeObject;
    iObjectArray.Reset();
    
    // choose if plugin tested, otherwise engine
    TPtrC testPlugin;
    TBool plugin = EFalse;
    User::LeaveIfError( aItem.GetNextString( testPlugin ));
    _LIT( pluginString, "plugin" );
    if( testPlugin == pluginString )
    	{
    	plugin = ETrue;
    	}
    
    // multiple objects
	for ( TInt i = 0; i < count; ++i )
		{
	    iHD = NULL;
	    mdeObject = NULL;
		
	    mdeObject = iMdEClient->GetObjectL( iIds[i] );
	    HBufC* uriBuf = mdeObject->Uri().AllocLC();
	    iHD = CHarvesterData::NewL( uriBuf );
	    iHD->SetMdeObject( mdeObject );
	    CleanupStack::Pop( uriBuf );
	    
	    iObjectArray.Append( iHD );
		}
	
	// snapshots
    if( plugin )
		{
		iPlugin->ContextSnapshot( *this, iObjectArray );
		}
	else
		{
		iContextEngine->ContextSnapshot( *this, iObjectArray );
		}
    
    _LIT( KMsg2, "Exit MultipleSnapshots" );
    iLog->Log( KMsg2 );  
    RDebug::Print( KMsg2 );
    
    return KErrNone;
    }