engine/collectionframework/datasource/plugins/glxdatasourcemde/src/glxdatasourcetaskmdeattribute.cpp
changeset 71 27f2d7aec52a
parent 69 45459746d5e8
child 72 0a8e959402e5
equal deleted inserted replaced
69:45459746d5e8 71:27f2d7aec52a
     1 /*
       
     2 * Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:   
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 #include "glxdatasourcetaskmdeattribute.h"
       
    21 
       
    22 #include <glxcollectionpluginCamera.hrh>
       
    23 #include <glxcollectionpluginDownloads.hrh>
       
    24 #include <glxcollectionpluginMonths.hrh>
       
    25 #include <glxcollectionpluginalbums.hrh>
       
    26 #include <glxcollectionpluginall.hrh>
       
    27 #include <glxcollectionplugintags.hrh>
       
    28 #include <glxerrors.h>
       
    29 #include <glxfilterfactory.h>
       
    30 #include <glxgetrequest.h>
       
    31 #include <glxgetrequest.h>
       
    32 #include <glxidlistrequest.h>
       
    33 #include <glxlog.h>
       
    34 #include <glxmediacollectioninternaldefs.h>
       
    35 #include <glxmediageneraldefs.h>
       
    36 #include <glxrequest.h>
       
    37 #include <glxthumbnailattributeinfo.h>
       
    38 #include <glxthumbnailrequest.h>
       
    39 #include <glxtndatabase.h>
       
    40 #include <glxtnfileinfo.h>
       
    41 #include <glxtnthumbnailcreator.h>
       
    42 #include <imageconversion.h>
       
    43 #include <lbsposition.h>
       
    44 #include <mdeconstants.h>
       
    45 #include <mdelogiccondition.h>
       
    46 #include <mdeobject.h>
       
    47 #include <mdeobjectdef.h>
       
    48 #include <mdeobjectquery.h>
       
    49 #include <mdepropertydef.h>
       
    50 #include <mderelationdef.h>
       
    51 #include <mdesession.h>
       
    52 #include <mdetextproperty.h>
       
    53 #include <mpxmedia.h>
       
    54 #include <mpxmediaarray.h> 
       
    55 #include <mpxmediacollectiondetaildefs.h>
       
    56 #include <mpxmediacontainerdefs.h>
       
    57 #include <mpxmediadrmdefs.h>
       
    58 #include <mpxmediageneraldefs.h>
       
    59 
       
    60 #include "glxdatasourcemde.h"
       
    61 #include "glxdatasourcemde.h"
       
    62 #include "glxdatasourcemde.hrh"
       
    63 
       
    64 // CONSTANTS
       
    65 
       
    66 _LIT(KPropertyDefNameAlbumType, "Type");
       
    67 _LIT(KPropertyDefNameComment, "Comment");
       
    68 _LIT(KPropertyDefNameCreationDate, "CreationDate");
       
    69 _LIT(KPropertyDefNameDRM, "DRM");
       
    70 _LIT(KPropertyDefNameDuration, "Duration");
       
    71 _LIT(KPropertyDefNameFrameCount, "FrameCount");
       
    72 _LIT(KPropertyDefNameHeight, "Height");
       
    73 _LIT(KPropertyDefNameItemType, "ItemType");
       
    74 _LIT(KPropertyDefNameLastModifiedDate, "LastModifiedDate");
       
    75 _LIT(KPropertyDefNameLatitude, "Latitude");
       
    76 _LIT(KPropertyDefNameLongitude, "Longitude");
       
    77 _LIT(KPropertyDefNameSize, "Size");
       
    78 _LIT(KPropertyDefNameTitle, "Title");
       
    79 _LIT(KPropertyDefNameUsageCount, "UsageCount");
       
    80 _LIT(KPropertyDefNameWidth, "Width");
       
    81 
       
    82 // ----------------------------------------------------------------------------
       
    83 //  Constructor
       
    84 // ----------------------------------------------------------------------------
       
    85 //  
       
    86 CGlxDataSourceTaskMdeAttribute::CGlxDataSourceTaskMdeAttribute(CGlxGetRequest* aRequest, MGlxDataSourceRequestObserver& aObserver, CGlxDataSource* aDataSource)
       
    87     : CGlxDataSourceTaskMde(aRequest, aObserver, aDataSource)
       
    88     {
       
    89     GLX_LOG_ENTRY_EXIT("CGlxDataSourceTaskMdeAttribute::CGlxDataSourceTaskMdeAttribute()");
       
    90     iFilterProperties = TGlxFilterFactory::ExtractAttributes(iRequest->Filter());
       
    91     }
       
    92 
       
    93 // ----------------------------------------------------------------------------
       
    94 //  Destructor
       
    95 // ----------------------------------------------------------------------------
       
    96 //  
       
    97 CGlxDataSourceTaskMdeAttribute::~CGlxDataSourceTaskMdeAttribute()
       
    98 	{
       
    99     GLX_LOG_ENTRY_EXIT("CGlxDataSourceTaskMdeAttribute::~CGlxDataSourceTaskMdeAttribute()");
       
   100     delete iMediaArray;
       
   101     iQueryAttributes.Close();
       
   102 	}
       
   103 
       
   104 // ----------------------------------------------------------------------------
       
   105 //  CGlxDataSourceTaskMdeAttribute::ExecuteRequestL
       
   106 // ----------------------------------------------------------------------------
       
   107 //      
       
   108 void CGlxDataSourceTaskMdeAttribute::ExecuteRequestL()
       
   109     {
       
   110     GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeAttribute::ExecuteRequestL()");
       
   111     CGlxGetRequest* request = static_cast<CGlxGetRequest*>(iRequest);
       
   112         
       
   113     __ASSERT_DEBUG(request->MediaIds().Count() > 0, User::Invariant());
       
   114     
       
   115     if (request->MediaIds().Count() > 1)
       
   116         {
       
   117         iMediaArray = CMPXMediaArray::NewL();
       
   118         }
       
   119     
       
   120     if (request->MediaIds()[0] == KGlxCollectionRootId)
       
   121     	{
       
   122         __ASSERT_DEBUG(request->MediaIds().Count() == 1, User::Invariant());
       
   123         AddCollectionAttributesL(iResponse);
       
   124     	}
       
   125     else
       
   126     	{
       
   127         
       
   128         __ASSERT_DEBUG(dynamic_cast<CGlxGetRequest*>(iRequest), Panic(EGlxPanicLogicError));
       
   129         CGlxGetRequest* request = static_cast<CGlxGetRequest*>(iRequest);   
       
   130 
       
   131         const RArray<TItemId>& mediaIds = reinterpret_cast<const RArray<TItemId>&>(request->MediaIds());
       
   132         
       
   133         switch(iFilterProperties.iItemType)
       
   134             {
       
   135             case EGlxFilterVideoAndImages:
       
   136             case EGlxFilterImage:
       
   137             case EGlxFilterVideo:
       
   138                 {
       
   139             	QueueImageVideoObjectQueriesL(mediaIds, iFilterProperties);
       
   140         	    if (LocationAttributeRequested())
       
   141         	        {
       
   142         	        QueueLocaitonQueryL();
       
   143         	        }
       
   144                 break;
       
   145                 }
       
   146             case EGlxFilterAlbum:
       
   147                 {
       
   148             	QueueAlbumObjectQueryL(mediaIds);
       
   149                 break;
       
   150                 }
       
   151             case EGlxFilterTag:
       
   152                 {
       
   153                 QueueTagObjectQueryL(mediaIds);
       
   154                 break;
       
   155                 }
       
   156             case EGlxFilterMonth:
       
   157                 {
       
   158                 QueueMonthObjectQueryL(mediaIds);
       
   159                 break;
       
   160                 }
       
   161             }
       
   162         
       
   163     	}
       
   164 
       
   165     DoNextQueryL();
       
   166     }
       
   167 
       
   168 // ----------------------------------------------------------------------------
       
   169 // CGlxDataSourceTaskMde::DoHandleQueryCompletedL
       
   170 // ----------------------------------------------------------------------------
       
   171 //
       
   172 void CGlxDataSourceTaskMdeAttribute::DoHandleQueryCompletedL(CMdEQuery& /*aQuery*/)
       
   173     {
       
   174     GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeAttribute::DoHandleQueryCompletedL()");   
       
   175     switch (iQueryTypes[0])
       
   176         {
       
   177         case ELocationAttributeQuery:
       
   178             DoHandleLocationQueryCompletedL();
       
   179         break;
       
   180         case EAttributeQuery:
       
   181             DoHandleAttributeQueryCompletedL();
       
   182         break;
       
   183         case EImageVideoQuery:
       
   184             DoHandleImageVideoQueryCompletedL();
       
   185         break;
       
   186         case EContainerFirstItemQuery:
       
   187             // Fall through to panic, DoHandleQueryCompletedL can't handle this query type.
       
   188         default:
       
   189             Panic(EGlxPanicLogicError);
       
   190         break;
       
   191         }  
       
   192     }
       
   193 
       
   194 // ----------------------------------------------------------------------------
       
   195 //  CGlxDataSourceTaskMdeAttribute::DoNextQueryL
       
   196 // ----------------------------------------------------------------------------
       
   197 //    
       
   198 void CGlxDataSourceTaskMdeAttribute::DoNextQueryL()
       
   199     {
       
   200     GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeAttribute::DoNextQueryL()");
       
   201     if (iQueries.Count())
       
   202         {
       
   203         ExecuteQueryL();
       
   204         }
       
   205     else
       
   206     	{
       
   207     	DoHandleAttributeResponseCompleteL();
       
   208     	}
       
   209     }
       
   210 
       
   211 // ----------------------------------------------------------------------------
       
   212 //  CGlxDataSourceTaskMdeAttribute::DoHandleAttributeResponseCompleteL
       
   213 // ----------------------------------------------------------------------------
       
   214 //     
       
   215 void CGlxDataSourceTaskMdeAttribute::DoHandleAttributeResponseCompleteL()
       
   216     {
       
   217     GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeAttribute::DoHandleAttributeResponseCompleteL()");
       
   218     __ASSERT_DEBUG(dynamic_cast<CGlxGetRequest*>(iRequest), Panic(EGlxPanicLogicError));
       
   219     CGlxGetRequest* request = static_cast<CGlxGetRequest*>(iRequest);
       
   220     if(request->MediaIds().Count() > 1)
       
   221         {
       
   222         iResponse->SetCObjectValueL(KMPXMediaArrayContents, iMediaArray);
       
   223         iResponse->SetTObjectValueL(KMPXMediaArrayCount, iMediaArray->Count());
       
   224         delete iMediaArray;
       
   225         iMediaArray = NULL;
       
   226         }
       
   227     HandleRequestComplete(KErrNone);
       
   228     }
       
   229 
       
   230 // ----------------------------------------------------------------------------
       
   231 // CGlxDataSourceTaskMdeAttribute::AddAttributesLC
       
   232 // ----------------------------------------------------------------------------
       
   233 //      
       
   234 void CGlxDataSourceTaskMdeAttribute::AddAttributesL(CMdEObject& aObject, CMPXMedia* aEntry)
       
   235     {
       
   236     GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeAttribute::AddAttributesL(CMdEObject& aObject, CMPXMedia* aEntry)");
       
   237     __ASSERT_DEBUG(dynamic_cast<CGlxGetRequest*>(iRequest), Panic(EGlxPanicLogicError));
       
   238     
       
   239     CGlxDataSource::TContainerType containerType = DataSource()->ContainerType(&aObject);
       
   240     if( containerType != CGlxDataSource::EContainerTypeNotAContainer )
       
   241         {
       
   242         AddContainerAttributesL(aEntry, &aObject, containerType);
       
   243         }
       
   244     else 
       
   245         {
       
   246         CGlxDataSource::TItemType itemType = DataSource()->ItemType(&aObject);
       
   247         if ( itemType != CGlxDataSource::EItemTypeNotAnItem )
       
   248             {
       
   249             AddItemAttributesL(aEntry, &aObject, itemType);
       
   250             }
       
   251         else
       
   252             {
       
   253             User::Leave(KErrNotSupported);
       
   254             }
       
   255         }       
       
   256     }
       
   257 
       
   258 // ----------------------------------------------------------------------------
       
   259 // CGlxDataSourceTaskMdeAttribute::AddCollectionAttributesL
       
   260 // ----------------------------------------------------------------------------
       
   261 //     
       
   262 void CGlxDataSourceTaskMdeAttribute::AddCollectionAttributesL(CMPXMedia* aEntry)
       
   263     {
       
   264     GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeAttribute::AddCollectionAttributesL(CMPXMedia* aEntry)");
       
   265     __ASSERT_DEBUG(aEntry, Panic(EGlxPanicLogicError));
       
   266     __ASSERT_DEBUG(dynamic_cast<CGlxGetRequest*>(iRequest), Panic(EGlxPanicLogicError));
       
   267     CGlxGetRequest* request = static_cast<CGlxGetRequest*>(iRequest);
       
   268     
       
   269     for ( TInt i = 0; i < request->Attributes().Count(); i++ )
       
   270         {
       
   271         if ( request->Attributes()[i] == KMPXMediaGeneralId )
       
   272             {
       
   273             aEntry->SetTObjectValueL<TMPXItemId>(KMPXMediaGeneralId, (TMPXItemId)request->CollectionPluginUid().iUid);
       
   274             }
       
   275         else if ( request->Attributes()[i] == KMPXMediaGeneralType )
       
   276             {
       
   277             aEntry->SetTObjectValueL(KMPXMediaGeneralType, EMPXNoType);
       
   278             }
       
   279         else if ( request->Attributes()[i] == KMPXMediaGeneralCategory )
       
   280             {
       
   281             aEntry->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXCollection);
       
   282             }
       
   283         else if ( request->Attributes()[i] == KMPXMediaGeneralTitle )
       
   284             {
       
   285             request->AppendCpiAttributeL(KMPXMediaGeneralTitle);
       
   286             }
       
   287         else if ( request->Attributes()[i] == KGlxMediaGeneralSystemItem )
       
   288             {
       
   289             aEntry->SetTObjectValueL(KGlxMediaGeneralSystemItem, ETrue);
       
   290             }
       
   291             
       
   292         
       
   293  #ifdef GLX_SUB_TITLE_REL8
       
   294             
       
   295         //Attributes to get the Count of Images in Container                
       
   296         else if	( request->Attributes()[i] == KGlxMediaItemTypeImage )    
       
   297         	{
       
   298         	TGlxMediaId container = TGlxMediaId(KGlxCollectionRootId);
       
   299             CMdEObjectDef* objectDef = &DataSource()->ObjectDef();
       
   300             TBool isContent = ETrue;
       
   301             TGlxFilterProperties filterProperties = iFilterProperties;
       
   302             
       
   303             switch(iRequest->CollectionPluginUid().iUid)
       
   304 	            {
       
   305 	        	case KGlxCollectionPluginCameraImplementationUid:
       
   306 	        		{        		
       
   307 	                 container = DataSource()->CameraAlbumId();
       
   308 	                 objectDef = &DataSource()->AlbumDef();
       
   309 	                 filterProperties.iItemType = EGlxFilterImage;
       
   310 	                 QueueObjectQueryL(*objectDef, isContent, EAttributeQuery, EQueryResultModeCount, container, request->Attributes()[i], aEntry,  filterProperties);
       
   311 	                 break;                    	
       
   312 	        		}
       
   313 	        	default:
       
   314 	        		{
       
   315 	        		break;	
       
   316 	        		}
       
   317 	        	 }
       
   318         	}           	
       
   319 		
       
   320 		
       
   321 		//Attributes to get the Count of Videos in Container                    	
       
   322          else if ( request->Attributes()[i] == KGlxMediaItemTypeVideo )    
       
   323         	{
       
   324         	TGlxMediaId container = TGlxMediaId(KGlxCollectionRootId);
       
   325             CMdEObjectDef* objectDef = &DataSource()->ObjectDef();
       
   326             TBool isContent = ETrue;
       
   327             TGlxFilterProperties filterProperties = iFilterProperties;
       
   328             
       
   329             switch(iRequest->CollectionPluginUid().iUid)
       
   330 	            {
       
   331 	        	case KGlxCollectionPluginCameraImplementationUid:
       
   332 	        		{        		
       
   333 	                 container = DataSource()->CameraAlbumId();
       
   334 	                 objectDef = &DataSource()->AlbumDef();
       
   335 	                 filterProperties.iItemType = EGlxFilterVideo;
       
   336 	                 QueueObjectQueryL(*objectDef, isContent, EAttributeQuery, EQueryResultModeCount, container, request->Attributes()[i], aEntry,  filterProperties);
       
   337 	                 break;                    	
       
   338 	        		}
       
   339 	        	default:
       
   340 	        		{
       
   341 	        		break;	
       
   342 	        		}
       
   343 	        	 }
       
   344         	}
       
   345         	
       
   346 #endif
       
   347 
       
   348         	
       
   349         else if ( ( request->Attributes()[i] == KMPXMediaGeneralCount ) || ( request->Attributes()[i] == KGlxMediaCollectionInternalUsageCount ) )
       
   350             {
       
   351             TGlxMediaId container = TGlxMediaId(KGlxCollectionRootId);
       
   352             CMdEObjectDef* objectDef = &DataSource()->ObjectDef();
       
   353             TBool isContent = ETrue;
       
   354             TGlxFilterProperties filterProperties = iFilterProperties;
       
   355             
       
   356             switch(iRequest->CollectionPluginUid().iUid)
       
   357                 {
       
   358 
       
   359                 case KGlxCollectionPluginAlbumsImplementationUid:
       
   360                     {
       
   361                     isContent = EFalse;
       
   362                     objectDef = &DataSource()->AlbumDef();
       
   363                     break;
       
   364                     }
       
   365                 case KGlxCollectionPluginCameraImplementationUid:
       
   366                     {
       
   367                     container = DataSource()->CameraAlbumId();
       
   368                     objectDef = &DataSource()->AlbumDef();
       
   369                     break;
       
   370                     }
       
   371                 case KGlxTagCollectionPluginImplementationUid: 
       
   372                     {
       
   373                     isContent = EFalse;
       
   374                     objectDef = &DataSource()->TagDef();
       
   375                     break;
       
   376                     }
       
   377                 case KGlxCollectionPluginMonthsImplementationUid:
       
   378                     {
       
   379                     container = DataSource()->CameraAlbumId();
       
   380                     objectDef = &DataSource()->AlbumDef();
       
   381                     break;
       
   382                     }
       
   383                 default:
       
   384                     {
       
   385                     // default gallery query returns all objects as per filter
       
   386                     break;
       
   387                     }
       
   388                 }
       
   389             QueueObjectQueryL(*objectDef, isContent, EAttributeQuery, EQueryResultModeCount, container, request->Attributes()[i], aEntry,  filterProperties);
       
   390             }
       
   391         else if ( request->Attributes()[i] == KMPXMediaColDetailSpaceId )
       
   392             {
       
   393             aEntry->SetTObjectValueL(KMPXMediaColDetailSpaceId, KGlxDataSourceMdeImplementationUid);
       
   394             }
       
   395         else if ( request->Attributes()[i] == KGlxMediaCollectionInternalStartDate )
       
   396             {
       
   397             TGlxFilterProperties filterProperties = iFilterProperties;
       
   398             filterProperties.iSortOrder = EGlxFilterSortOrderCaptureDate;
       
   399             filterProperties.iSortDirection = EGlxFilterSortDirectionAscending;
       
   400 
       
   401             QueueObjectQueryL(DataSource()->AlbumDef(), ETrue, EAttributeQuery, EQueryResultModeObjectWithoutFreetexts, DataSource()->CameraAlbumId(), KGlxMediaCollectionInternalStartDate, aEntry, filterProperties);
       
   402             }
       
   403         else if ( request->Attributes()[i] == KGlxMediaCollectionInternalEndDate )
       
   404             {
       
   405             // not necessary to be requested, returned when StartDate requested
       
   406             }
       
   407         else if ( request->Attributes()[i] == KGlxMediaGeneralSlideshowableContent )
       
   408             {
       
   409             aEntry->SetTObjectValueL(KGlxMediaGeneralSlideshowableContent, 0);
       
   410             }
       
   411         else if ( request->Attributes()[i] == KMPXMediaDrmProtected )
       
   412             {
       
   413             // collection itself is not protected
       
   414             aEntry->SetTObjectValueL(KMPXMediaDrmProtected, EFalse); 
       
   415             }
       
   416         else
       
   417             {
       
   418             User::Leave(KErrNotSupported);
       
   419             }
       
   420         }
       
   421     }
       
   422 
       
   423 
       
   424     
       
   425 // ----------------------------------------------------------------------------
       
   426 // CGlxDataSourceTaskMdeAttribute::AddContainerAttributesL
       
   427 // ----------------------------------------------------------------------------
       
   428 //
       
   429 void CGlxDataSourceTaskMdeAttribute::AddContainerAttributesL(CMPXMedia* aEntry, CMdEObject* aContainer, CGlxDataSource::TContainerType aType)
       
   430     {
       
   431     GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeAttribute::AddContainerAttributesL()");
       
   432     __ASSERT_DEBUG(aEntry, Panic(EGlxPanicLogicError));
       
   433     __ASSERT_DEBUG(aContainer, Panic(EGlxPanicLogicError));
       
   434     __ASSERT_DEBUG(dynamic_cast<CGlxGetRequest*>(iRequest), Panic(EGlxPanicLogicError));
       
   435     CGlxGetRequest* request = static_cast<CGlxGetRequest*>(iRequest);
       
   436 
       
   437     /// @todo check property defs are valid and type is correct
       
   438     for ( TInt i = 0; i < request->Attributes().Count(); i++ )
       
   439         {
       
   440         if ( request->Attributes()[i] == KMPXMediaGeneralId )
       
   441             {
       
   442             aEntry->SetTObjectValueL<TMPXItemId>(KMPXMediaGeneralId, (TMPXItemId)aContainer->Id());
       
   443             }
       
   444         else if ( request->Attributes()[i] == KMPXMediaGeneralType )
       
   445             {
       
   446             aEntry->SetTObjectValueL(KMPXMediaGeneralType, EMPXGroup);
       
   447             }
       
   448         else if ( request->Attributes()[i] == KMPXMediaGeneralCategory )
       
   449             {
       
   450             if( CGlxDataSource::EContainerTypeAlbum == aType)
       
   451                 {
       
   452                 aEntry->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXAlbum);
       
   453                 }
       
   454             else if( CGlxDataSource::EContainerTypeTag == aType)
       
   455                 {
       
   456                 aEntry->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXTag);
       
   457                 }
       
   458             else if( CGlxDataSource::EContainerTypeMonth == aType)
       
   459                 {
       
   460                 aEntry->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXMonth);
       
   461                 }
       
   462             else
       
   463                 {
       
   464                 User::Leave(KErrNotSupported);
       
   465                 }
       
   466             }
       
   467         else if ( request->Attributes()[i] == KMPXMediaGeneralUri )
       
   468             {
       
   469             aEntry->SetTextValueL(KMPXMediaGeneralUri, aContainer->Uri());
       
   470             }
       
   471         else if ( request->Attributes()[i] == KMPXMediaGeneralTitle )
       
   472             {
       
   473             CMdEProperty* title;
       
   474             CMdEPropertyDef* titleProperty = aContainer->Def().GetPropertyDefL(KPropertyDefNameTitle);
       
   475             TInt titleIndex = aContainer->Property(*titleProperty, title);
       
   476             if(titleIndex == KErrNotFound)
       
   477                 {
       
   478                 TParsePtrC parser(aContainer->Uri());
       
   479                 aEntry->SetTextValueL(KMPXMediaGeneralTitle, parser.Name());
       
   480                 }
       
   481             else
       
   482                 {
       
   483                 aEntry->SetTextValueL(KMPXMediaGeneralTitle, static_cast<CMdETextProperty*>(title)->Value());
       
   484                 }
       
   485             switch (aType)
       
   486                 {
       
   487                 case CGlxDataSource::EContainerTypeAlbum:
       
   488                     {
       
   489                     CMdEProperty* albumType;
       
   490                     CMdEPropertyDef* albumTypeProperty = aContainer->Def().GetPropertyDefL(KPropertyDefNameAlbumType);
       
   491                     TInt albumTypeIndex = aContainer->Property(*albumTypeProperty, albumType);
       
   492                     if( KErrNotFound != albumTypeIndex )
       
   493                         {
       
   494                         TUint16 albumTypeValue = static_cast<CMdEUint16Property*>(albumType)->Value();
       
   495                         if ( albumTypeValue != MdeConstants::Album::EAlbumUser ) 
       
   496                             {
       
   497                             request->AppendCpiAttributeL(KMPXMediaGeneralTitle);
       
   498                             aEntry->SetTObjectValueL(KGlxMediaCollectionInternalSystemItemType, albumTypeValue);
       
   499                             }
       
   500                         }
       
   501                     break;
       
   502                     }
       
   503                 case CGlxDataSource::EContainerTypeTag:
       
   504                     {
       
   505                     break;
       
   506                     }
       
   507                 case CGlxDataSource::EContainerTypeMonth:
       
   508                     {
       
   509                     request->AppendCpiAttributeL(KMPXMediaGeneralTitle);
       
   510                     CMdEProperty* time;
       
   511                     CMdEPropertyDef* timeProperty = aContainer->Def().GetPropertyDefL(KPropertyDefNameCreationDate);
       
   512                     TInt timeIndex = aContainer->Property(*timeProperty, time);
       
   513                     if( KErrNotFound == timeIndex )
       
   514                         {
       
   515                         User::Leave(KErrCorrupt);
       
   516                         }
       
   517 
       
   518                     aEntry->SetTObjectValueL(KGlxMediaCollectionInternalStartDate, static_cast<CMdETimeProperty*>(time)->Value());
       
   519                     break;
       
   520                     }
       
   521                 }
       
   522             }
       
   523         else if ( request->Attributes()[i] == KMPXMediaGeneralDate )
       
   524             {
       
   525             CMdEProperty* time;
       
   526             CMdEPropertyDef* timeProperty = aContainer->Def().GetPropertyDefL(KPropertyDefNameCreationDate);
       
   527             TInt timeIndex = aContainer->Property(*timeProperty, time);
       
   528             if( KErrNotFound == timeIndex )
       
   529                 {
       
   530                 User::Leave(KErrCorrupt);
       
   531                 }
       
   532 
       
   533             aEntry->SetTObjectValueL(KMPXMediaGeneralDate, static_cast<CMdETimeProperty*>(time)->Value());
       
   534             }
       
   535         else if ( request->Attributes()[i] == KMPXMediaGeneralSize )
       
   536             {
       
   537             CMdEProperty* size;
       
   538             CMdEPropertyDef* sizeProperty = aContainer->Def().GetPropertyDefL(KPropertyDefNameSize);
       
   539             TInt sizeIndex = aContainer->Property(*sizeProperty, size);
       
   540             TInt sizeValue;
       
   541             if(sizeIndex == KErrNotFound)
       
   542                 {
       
   543                 sizeValue = 0;
       
   544                 }
       
   545             else
       
   546                 {
       
   547                 sizeValue = static_cast<CMdEInt32Property*>(size)->Value();
       
   548                 }
       
   549             aEntry->SetTObjectValueL(KMPXMediaGeneralSize, sizeValue);
       
   550             }
       
   551         else if ( request->Attributes()[i] == KMPXMediaGeneralDrive )
       
   552             {
       
   553             TParsePtrC parser(aContainer->Uri());
       
   554             aEntry->SetTextValueL(KMPXMediaGeneralDrive, parser.Drive());
       
   555             }
       
   556         else if ( request->Attributes()[i] == KMPXMediaGeneralMimeType )
       
   557             {
       
   558             CMdEProperty* mimeType;
       
   559             CMdEPropertyDef* mimeTypeProperty = aContainer->Def().GetPropertyDefL(KPropertyDefNameItemType);
       
   560             TInt mimeTypeIndex = aContainer->Property(*mimeTypeProperty, mimeType);
       
   561             if( KErrNotFound == mimeTypeIndex)
       
   562                 {
       
   563                 aEntry->SetTextValueL(KMPXMediaGeneralMimeType, KNullDesC); 
       
   564                 }
       
   565             else
       
   566                 {
       
   567                 aEntry->SetTextValueL(KMPXMediaGeneralMimeType, static_cast<CMdETextProperty*>(mimeType)->Value());
       
   568                 }
       
   569             }
       
   570         else if ( ( request->Attributes()[i] == KMPXMediaGeneralCount ) || ( request->Attributes()[i] == KGlxMediaCollectionInternalUsageCount ) )
       
   571             {
       
   572             switch (aType)
       
   573                 {
       
   574                 case CGlxDataSource::EContainerTypeAlbum:
       
   575                 case CGlxDataSource::EContainerTypeTag:
       
   576                     {
       
   577                     CMdEProperty* countType;
       
   578                     CMdEPropertyDef* countTypeProperty = aContainer->Def().GetPropertyDefL(KPropertyDefNameUsageCount);
       
   579                     TInt countTypeIndex = aContainer->Property(*countTypeProperty, countType);
       
   580                     if( KErrNotFound != countTypeIndex )
       
   581                         {
       
   582                         TUint count = static_cast<CMdEUint32Property*>(countType)->Value();
       
   583                         aEntry->SetTObjectValueL(request->Attributes()[i], count);
       
   584                         }
       
   585                     else
       
   586                         {
       
   587                         aEntry->SetTObjectValueL(request->Attributes()[i], 0);
       
   588                         }
       
   589                     break;
       
   590                     }
       
   591                 case CGlxDataSource::EContainerTypeMonth:
       
   592                     {
       
   593                     TGlxFilterProperties filterProperties = iFilterProperties;
       
   594                     AddMonthFilterL(aContainer, filterProperties);
       
   595                     QueueObjectQueryL(DataSource()->AlbumDef(), ETrue, EAttributeQuery, EQueryResultModeCount, DataSource()->CameraAlbumId(), request->Attributes()[i], aEntry, filterProperties);
       
   596                     break;
       
   597                     }
       
   598                 }
       
   599             }
       
   600         else if ( request->Attributes()[i] == KGlxMediaGeneralSystemItem )
       
   601             {
       
   602             TBool systemItem = EFalse;
       
   603             switch (aType)
       
   604                 {
       
   605                 case CGlxDataSource::EContainerTypeAlbum:
       
   606                     {
       
   607                     CMdEProperty* albumType;
       
   608                     CMdEPropertyDef* albumTypeProperty = aContainer->Def().GetPropertyDefL(KPropertyDefNameAlbumType);
       
   609                     TInt albumTypeIndex = aContainer->Property(*albumTypeProperty, albumType);
       
   610                     if( KErrNotFound != albumTypeIndex )
       
   611                         {
       
   612                         TInt albumTypeValue = static_cast<CMdEUint16Property*>(albumType)->Value();
       
   613                         if( (albumTypeValue == MdeConstants::Album::EAlbumSystemCamera) || (albumTypeValue == MdeConstants::Album::EAlbumSystemFavourite ) )
       
   614                             {
       
   615                             systemItem = ETrue;
       
   616                             }
       
   617                         }
       
   618                     break;
       
   619                     }
       
   620                 case CGlxDataSource::EContainerTypeTag:
       
   621                     {
       
   622                     systemItem = EFalse;
       
   623                     break;
       
   624                     }
       
   625                 case CGlxDataSource::EContainerTypeMonth:
       
   626                     {
       
   627                     systemItem = ETrue;
       
   628                     break;
       
   629                     }
       
   630                 }
       
   631             aEntry->SetTObjectValueL(KGlxMediaGeneralSystemItem, systemItem);
       
   632             }
       
   633             
       
   634          //Attributes to get the Count of Images in Container                
       
   635         else if	( request->Attributes()[i] == KGlxMediaItemTypeImage )    
       
   636         	{
       
   637             switch (aType)
       
   638 	            {
       
   639 	        	case CGlxDataSource::EContainerTypeMonth:
       
   640 	        		{
       
   641                     TGlxFilterProperties filterProperties = iFilterProperties;
       
   642                     AddMonthFilterL(aContainer, filterProperties);
       
   643                     filterProperties.iItemType = EGlxFilterImage;
       
   644                     QueueObjectQueryL(DataSource()->AlbumDef(), ETrue, EAttributeQuery, EQueryResultModeCount, DataSource()->CameraAlbumId(), request->Attributes()[i], aEntry, filterProperties);
       
   645                     break;
       
   646                     }
       
   647 	        	default:
       
   648 	        		{
       
   649 	        		break;	
       
   650 	        		}
       
   651 	        	 }
       
   652         	}           	
       
   653 		
       
   654 		// Attributes to get the Count of Videos in Container 		
       
   655 						                   	
       
   656          else if ( request->Attributes()[i] == KGlxMediaItemTypeVideo )    
       
   657         	{
       
   658             switch (aType)
       
   659 	            {
       
   660 	        	case CGlxDataSource::EContainerTypeMonth:
       
   661 	        		{
       
   662                     TGlxFilterProperties filterProperties = iFilterProperties;
       
   663                     AddMonthFilterL(aContainer, filterProperties);
       
   664                     filterProperties.iItemType = EGlxFilterVideo;
       
   665                     QueueObjectQueryL(DataSource()->AlbumDef(), ETrue, EAttributeQuery, EQueryResultModeCount, DataSource()->CameraAlbumId(), request->Attributes()[i], aEntry, filterProperties);
       
   666                     break;
       
   667                     }
       
   668 	        	default:
       
   669 	        		{
       
   670 	        		break;	
       
   671 	        		}
       
   672 	        	 }
       
   673         	}
       
   674             
       
   675         else if ( request->Attributes()[i] == KMPXMediaColDetailSpaceId )
       
   676             {
       
   677             aEntry->SetTObjectValueL(KMPXMediaColDetailSpaceId, KGlxDataSourceMdeImplementationUid);
       
   678             }
       
   679         else if ( request->Attributes()[i] == KGlxMediaCollectionInternalStartDate )
       
   680             {
       
   681             // nothing returned for container but is valid for CPI to request
       
   682             }
       
   683         else if ( request->Attributes()[i] == KGlxMediaCollectionInternalEndDate )
       
   684             {
       
   685             // nothing returned for container but is valid for CPI to request
       
   686             }
       
   687         else if ( request->Attributes()[i] == KGlxMediaGeneralDimensions )
       
   688             {
       
   689             // return zero size for container (thumbnail only used in preview list)
       
   690             aEntry->SetTObjectValueL(KGlxMediaGeneralDimensions, TSize(0,0));
       
   691             }
       
   692         else if ( request->Attributes()[i] == KMPXMediaDrmProtected )
       
   693             {
       
   694             // container itself is not protected
       
   695             aEntry->SetTObjectValueL(KMPXMediaDrmProtected, EFalse); 
       
   696             }
       
   697         else if ( request->Attributes()[i] == KGlxMediaGeneralFramecount )
       
   698             {
       
   699             aEntry->SetTObjectValueL(KGlxMediaGeneralFramecount, 1);
       
   700             }
       
   701         else if ( request->Attributes()[i] == KGlxMediaGeneralSlideshowableContent )
       
   702             {
       
   703             TGlxFilterProperties filterProperties = iFilterProperties;
       
   704             filterProperties.iItemType = EGlxFilterImage;
       
   705             filterProperties.iNoDRM = ETrue;
       
   706             filterProperties.iExcludeAnimation = ETrue;
       
   707             switch (aType)
       
   708                 {
       
   709                 case CGlxDataSource::EContainerTypeAlbum:
       
   710                 case CGlxDataSource::EContainerTypeTag:
       
   711                     {
       
   712                     QueueObjectQueryL(aContainer->Def(), ETrue, EAttributeQuery, EQueryResultModeCount, TGlxMediaId(aContainer->Id()), request->Attributes()[i], aEntry, filterProperties);
       
   713                     break;
       
   714                     }
       
   715                 case CGlxDataSource::EContainerTypeMonth:
       
   716                     {
       
   717                     AddMonthFilterL(aContainer, filterProperties);
       
   718                     QueueObjectQueryL(DataSource()->AlbumDef(), ETrue, EAttributeQuery, EQueryResultModeCount, DataSource()->CameraAlbumId(), request->Attributes()[i], aEntry, filterProperties);
       
   719                     break;
       
   720                     }
       
   721                 }
       
   722             }
       
   723         else if ( request->Attributes()[i] == KGlxMediaGeneralLastModifiedDate )
       
   724             {
       
   725             CMdEProperty* time;
       
   726             CMdEPropertyDef* timeProperty = aContainer->Def().GetPropertyDefL(KPropertyDefNameLastModifiedDate);
       
   727             TInt timeIndex = aContainer->Property(*timeProperty, time);
       
   728             if( KErrNotFound == timeIndex) 
       
   729                 {
       
   730                 User::Leave(KErrCorrupt);
       
   731                 }
       
   732             aEntry->SetTObjectValueL(KGlxMediaGeneralLastModifiedDate, static_cast<CMdETimeProperty*>(time)->Value());
       
   733             }
       
   734         else if ( request->Attributes()[i] == KGlxMediaGeneralDimensions )
       
   735             {
       
   736             TSize dimensions(0,0);
       
   737             
       
   738             aEntry->SetTObjectValueL(KGlxMediaGeneralDimensions, dimensions);
       
   739             }
       
   740         else
       
   741             {
       
   742             User::Leave(KErrNotSupported);
       
   743             }
       
   744         }
       
   745     }
       
   746 
       
   747 // ----------------------------------------------------------------------------
       
   748 // CGlxDataSourceTaskMdeAttribute::AddItemAttributesL
       
   749 // ----------------------------------------------------------------------------
       
   750 //
       
   751 void CGlxDataSourceTaskMdeAttribute::AddItemAttributesL(CMPXMedia* aEntry, CMdEObject* aItem, CGlxDataSource::TItemType aType)
       
   752     {
       
   753     GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeAttribute::AddItemAttributesL(CMPXMedia* aEntry, CMdEObject* aItem, CGlxDataSource::TItemType aType)");
       
   754     __ASSERT_DEBUG(aEntry, Panic(EGlxPanicLogicError));
       
   755     __ASSERT_DEBUG(aItem, Panic(EGlxPanicLogicError));
       
   756     __ASSERT_DEBUG(dynamic_cast<CGlxGetRequest*>(iRequest), Panic(EGlxPanicLogicError));
       
   757     CGlxGetRequest* request = static_cast<CGlxGetRequest*>(iRequest);
       
   758 
       
   759     /// @todo check property defs are valid and type is correct
       
   760     for ( TInt i = 0; i < request->Attributes().Count(); i++ )
       
   761         {   
       
   762         if ( request->Attributes()[i] == KMPXMediaGeneralId )
       
   763             {
       
   764             aEntry->SetTObjectValueL<TMPXItemId>(KMPXMediaGeneralId, (TMPXItemId)aItem->Id());
       
   765             }
       
   766         else if ( request->Attributes()[i] == KMPXMediaGeneralType )
       
   767             {
       
   768             aEntry->SetTObjectValueL(KMPXMediaGeneralType, EMPXItem);
       
   769             }
       
   770         else if ( request->Attributes()[i] == KMPXMediaGeneralCategory )
       
   771             {
       
   772             if( CGlxDataSource::EItemTypeImage == aType)
       
   773                 {
       
   774                 aEntry->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXImage);
       
   775                 }
       
   776             else if( CGlxDataSource::EItemTypeVideo == aType)
       
   777                 {
       
   778                 aEntry->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXVideo);
       
   779                 }
       
   780             else
       
   781                 {
       
   782                 User::Leave(KErrNotSupported);
       
   783                 }
       
   784             }
       
   785         else if ( request->Attributes()[i] == KMPXMediaGeneralUri )
       
   786             {
       
   787             aEntry->SetTextValueL(KMPXMediaGeneralUri, aItem->Uri());
       
   788             }
       
   789         else if ( request->Attributes()[i] == KMPXMediaGeneralTitle )
       
   790             {
       
   791             CMdEProperty* title;
       
   792             CMdEPropertyDef* titleProperty = aItem->Def().GetPropertyDefL(KPropertyDefNameTitle);
       
   793             TInt titleIndex = aItem->Property(*titleProperty, title);
       
   794             if( KErrNotFound == titleIndex )
       
   795                 {
       
   796                 TParsePtrC parser(aItem->Uri());
       
   797                 aEntry->SetTextValueL(KMPXMediaGeneralTitle, parser.Name());
       
   798                 }
       
   799             else
       
   800                 {
       
   801                 aEntry->SetTextValueL(KMPXMediaGeneralTitle, static_cast<CMdETextProperty*>(title)->Value());
       
   802                 }
       
   803             }
       
   804         else if ( request->Attributes()[i] == KMPXMediaGeneralDate )
       
   805             {
       
   806             CMdEProperty* time;
       
   807             CMdEPropertyDef* timeProperty = aItem->Def().GetPropertyDefL(KPropertyDefNameCreationDate);
       
   808             TInt timeIndex = aItem->Property(*timeProperty, time);
       
   809             if( KErrNotFound == timeIndex) 
       
   810                 {
       
   811                 User::Leave(KErrCorrupt);
       
   812                 }
       
   813             aEntry->SetTObjectValueL(KMPXMediaGeneralDate, static_cast<CMdETimeProperty*>(time)->Value());
       
   814             }
       
   815         else if ( request->Attributes()[i] == KGlxMediaGeneralLastModifiedDate )
       
   816             {
       
   817             CMdEProperty* time;
       
   818             CMdEPropertyDef* timeProperty = aItem->Def().GetPropertyDefL(KPropertyDefNameLastModifiedDate);
       
   819             TInt timeIndex = aItem->Property(*timeProperty, time);
       
   820             if( KErrNotFound == timeIndex) 
       
   821                 {
       
   822                 User::Leave(KErrCorrupt);
       
   823                 }
       
   824             aEntry->SetTObjectValueL(KGlxMediaGeneralLastModifiedDate, static_cast<CMdETimeProperty*>(time)->Value());
       
   825             }
       
   826         else if ( request->Attributes()[i] == KMPXMediaGeneralSize )
       
   827             {
       
   828             CMdEProperty* size;
       
   829             CMdEPropertyDef* sizeProperty = aItem->Def().GetPropertyDefL(KPropertyDefNameSize);
       
   830             TInt sizeIndex = aItem->Property(*sizeProperty, size);
       
   831             User::LeaveIfError(sizeIndex);
       
   832             
       
   833             aEntry->SetTObjectValueL(KMPXMediaGeneralSize, static_cast<CMdEInt32Property*>(size)->Value());
       
   834             }
       
   835         else if ( request->Attributes()[i] == KMPXMediaGeneralDrive )
       
   836             {
       
   837             TParsePtrC parser(aItem->Uri());
       
   838             aEntry->SetTextValueL(KMPXMediaGeneralDrive, parser.Drive());
       
   839             }
       
   840         else if ( request->Attributes()[i] == KMPXMediaGeneralMimeType )
       
   841             {
       
   842             CMdEProperty* mimeType;
       
   843             CMdEPropertyDef* mimeTypeProperty = aItem->Def().GetPropertyDefL(KPropertyDefNameItemType);
       
   844             TInt mimeTypeIndex = aItem->Property(*mimeTypeProperty, mimeType);
       
   845 
       
   846             User::LeaveIfError(mimeTypeIndex); 
       
   847             aEntry->SetTextValueL(KMPXMediaGeneralMimeType, static_cast<CMdETextProperty*>(mimeType)->Value());
       
   848             }
       
   849         else if ( request->Attributes()[i] == KMPXMediaGeneralDuration )
       
   850             {
       
   851             if( CGlxDataSource::EItemTypeImage == aType )
       
   852                 {
       
   853                 aEntry->SetTObjectValueL(KMPXMediaGeneralDuration, 0);
       
   854                 }
       
   855             else
       
   856                 {
       
   857                 CMdEProperty* duration;
       
   858                 CMdEPropertyDef* durationProperty = aItem->Def().GetPropertyDefL(KPropertyDefNameDuration);
       
   859                 TInt durationIndex = aItem->Property(*durationProperty, duration);
       
   860                 User::LeaveIfError(durationIndex); 
       
   861                 
       
   862                 aEntry->SetTObjectValueL(KMPXMediaGeneralDuration, static_cast<CMdEUint32Property*>(duration)->Value());
       
   863                 }
       
   864             }
       
   865         else if ( request->Attributes()[i] == KGlxMediaGeneralSystemItem)
       
   866             {
       
   867             aEntry->SetTObjectValueL(KGlxMediaGeneralSystemItem, EFalse);
       
   868             }
       
   869         else if ( request->Attributes()[i] == KGlxMediaGeneralDimensions )
       
   870             {
       
   871             TSize dimensions(0,0);
       
   872             
       
   873             CMdEProperty* xDim;
       
   874             CMdEPropertyDef* xDimProperty = aItem->Def().GetPropertyDefL(KPropertyDefNameWidth);
       
   875             TInt xDimIndex = aItem->Property(*xDimProperty, xDim);
       
   876             if( KErrNotFound == xDimIndex )
       
   877                 {
       
   878                 //User::Leave(KErrCorrupt);
       
   879                 }
       
   880             else
       
   881                 {
       
   882                 dimensions.iWidth = static_cast<CMdEUint16Property*>(xDim)->Value();
       
   883                 }
       
   884             
       
   885             CMdEProperty* yDim;
       
   886             CMdEPropertyDef* yDimProperty = aItem->Def().GetPropertyDefL(KPropertyDefNameHeight);
       
   887             TInt yDimIndex = aItem->Property(*yDimProperty, yDim);
       
   888             if( KErrNotFound == yDimIndex )
       
   889                 {
       
   890                 //User::Leave(KErrCorrupt);
       
   891                 }
       
   892             else
       
   893                 {
       
   894                 dimensions.iHeight = static_cast<CMdEUint16Property*>(yDim)->Value();
       
   895                 }
       
   896             if ( ( dimensions.iWidth == 0 ) || ( dimensions.iHeight == 0 ) )
       
   897                 {
       
   898                 if( CGlxDataSource::EItemTypeImage == aType)
       
   899                     {
       
   900                     // EXIF header is corrupt, must read size from file.
       
   901                     CImageDecoder* decoder = NULL;
       
   902 
       
   903                     TRAPD(err, decoder = CImageDecoder::FileNewL( DataSource()->FileServerSession(), aItem->Uri(), CImageDecoder::EOptionNone ));
       
   904                     if (err == KErrNone)
       
   905                     	{
       
   906                     	dimensions = decoder->FrameInfo().iOverallSizeInPixels;
       
   907                     	}
       
   908                     delete decoder;
       
   909                     }
       
   910                 }
       
   911             
       
   912             aEntry->SetTObjectValueL(KGlxMediaGeneralDimensions, dimensions);
       
   913             }
       
   914         else if ( request->Attributes()[i] == KGlxMediaGeneralFramecount )
       
   915             {
       
   916             CMdEProperty* framecount;
       
   917             TInt fcount = 1;
       
   918             CMdEPropertyDef* framecountProperty = aItem->Def().GetPropertyDefL(KPropertyDefNameFrameCount);
       
   919             if( framecountProperty )
       
   920                 {
       
   921                 TInt framecountIndex = aItem->Property(*framecountProperty, framecount);
       
   922                 if( KErrNotFound != framecountIndex )
       
   923                     {
       
   924                     fcount = static_cast<CMdEUint32Property*>(framecount)->Value();
       
   925                     }
       
   926                 }
       
   927              aEntry->SetTObjectValueL(KGlxMediaGeneralFramecount, fcount);
       
   928             }
       
   929         else if ( request->Attributes()[i] == KMPXMediaGeneralComment )
       
   930             {
       
   931             CMdEProperty* comment;
       
   932             CMdEPropertyDef* commentProperty = aItem->Def().GetPropertyDefL(KPropertyDefNameComment); /// @todo using Exif Comment field for comment as spec is not clear
       
   933             TInt commentIndex = aItem->Property(*commentProperty, comment);
       
   934             if( KErrNotFound == commentIndex)
       
   935                 {
       
   936                 aEntry->SetTextValueL(KMPXMediaGeneralComment, KNullDesC); 
       
   937                 }
       
   938             else
       
   939                 {
       
   940                 aEntry->SetTextValueL(KMPXMediaGeneralComment, static_cast<CMdETextProperty*>(comment)->Value());
       
   941                 }
       
   942             }
       
   943         else if ( request->Attributes()[i] == KMPXMediaDrmProtected )
       
   944             {
       
   945             CMdEProperty* drmProtected;
       
   946             CMdEPropertyDef* drmProtectedProperty = aItem->Def().GetPropertyDefL(KPropertyDefNameDRM); 
       
   947             TInt drmProtectedIndex = aItem->Property(*drmProtectedProperty, drmProtected);
       
   948             if( KErrNotFound == drmProtectedIndex)
       
   949                 {
       
   950                 aEntry->SetTObjectValueL(KMPXMediaDrmProtected, EFalse); 
       
   951                 }
       
   952             else
       
   953                 {
       
   954                 aEntry->SetTObjectValueL(KMPXMediaDrmProtected, static_cast<CMdEBoolProperty*>(drmProtected)->Value());
       
   955                 }
       
   956             }
       
   957         else if ( request->Attributes()[i] == KMPXMediaGeneralCount )
       
   958             {
       
   959             aEntry->SetTObjectValueL(KMPXMediaGeneralCount, 1);
       
   960             }
       
   961         else if ( request->Attributes()[i] == KMPXMediaColDetailSpaceId )
       
   962             {
       
   963             aEntry->SetTObjectValueL(KMPXMediaColDetailSpaceId, KGlxDataSourceMdeImplementationUid);
       
   964             }
       
   965         else if ( request->Attributes()[i] == KGlxMediaGeneralSlideshowableContent )
       
   966             {
       
   967             aEntry->SetTObjectValueL(KGlxMediaGeneralSlideshowableContent, -1);
       
   968             }
       
   969         else if ( request->Attributes()[i] == KGlxMediaGeneralLocation)
       
   970             {
       
   971             // Set the attribute to a TCoordinate initialised to NaN. 
       
   972             aEntry->SetTObjectValueL(KGlxMediaGeneralLocation, TCoordinate());
       
   973             }
       
   974         else
       
   975             {
       
   976             User::Leave(KErrNotSupported);
       
   977             }
       
   978         }
       
   979     }
       
   980 
       
   981 // ----------------------------------------------------------------------------
       
   982 // CGlxDataSourceTaskMde::AddLocationAttributeToMediaL
       
   983 // ----------------------------------------------------------------------------
       
   984 //
       
   985 void CGlxDataSourceTaskMdeAttribute::AddLocationAttributeToMediaL(CMPXMedia& aMedia, const TItemId& aLocationId)
       
   986     {
       
   987     GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeAttribute::AddLocationAttributeToMediaL(CMPXMedia& aMedia, const TItemId& aLocationId)");
       
   988     CMdEObject* location = DataSource()->Session().GetObjectL(aLocationId, DataSource()->LocationDef()); 
       
   989     if(!location)
       
   990         {
       
   991         User::Leave(KErrNotFound);
       
   992         }
       
   993     CleanupStack::PushL(location);
       
   994     CMdEProperty* longitude = NULL;
       
   995     CMdEPropertyDef* longitudePropertyDef = location->Def().GetPropertyDefL(KPropertyDefNameLongitude);
       
   996     TInt longitudeIndex = location->Property(*longitudePropertyDef, longitude);
       
   997     CMdEProperty* latitude = NULL;
       
   998     CMdEPropertyDef* latitudePropertyDef = location->Def().GetPropertyDefL(KPropertyDefNameLatitude);
       
   999     TInt latitudeIndex = location->Property(*latitudePropertyDef, latitude);
       
  1000 
       
  1001     if (longitudeIndex > KErrNotFound && latitudeIndex > KErrNotFound)
       
  1002         {
       
  1003         TCoordinate coordinate(static_cast< CMdEReal64Property *>(latitude)->Value(),static_cast< CMdEReal64Property *>(longitude)->Value());
       
  1004         aMedia.SetTObjectValueL(KGlxMediaGeneralLocation, coordinate); 
       
  1005         }
       
  1006     
       
  1007     CleanupStack::PopAndDestroy(location);
       
  1008     }
       
  1009 
       
  1010 // ----------------------------------------------------------------------------
       
  1011 // CGlxDataSourceTaskMdeAttribute::DoHandleAttributeQueryCompletedL
       
  1012 // ----------------------------------------------------------------------------
       
  1013 //
       
  1014 void CGlxDataSourceTaskMdeAttribute::DoHandleAttributeQueryCompletedL()
       
  1015     {
       
  1016     GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeAttribute::DoHandleAttributeQueryCompletedL()");
       
  1017     __ASSERT_DEBUG(iQueryAttributes.Count(), Panic(EGlxPanicIllegalState));
       
  1018     CMdEQuery* query =  iQueries[0];
       
  1019     
       
  1020     if( EQueryResultModeObjectWithoutFreetexts == query->ResultMode() )
       
  1021         {
       
  1022         __ASSERT_DEBUG(( iQueryAttributes[0].iAttribute == KGlxMediaCollectionInternalStartDate ), Panic(EGlxPanicIllegalState));
       
  1023     	CMdEPropertyDef* creationDateDef = DataSource()->ObjectDef().GetPropertyDefL(KPropertyDefNameCreationDate);
       
  1024         if (!creationDateDef  || creationDateDef->PropertyType() != EPropertyTime)
       
  1025         	{
       
  1026         	User::Leave(KErrCorrupt);
       
  1027         	}
       
  1028         TTime startMonth(0);	
       
  1029         TTime endMonth(0);	
       
  1030         if(iQueries[0]->Count() )
       
  1031             {
       
  1032             CMdEProperty* startTime;
       
  1033             CMdEObject& startObject = (CMdEObject&)query->ResultItem(0);
       
  1034             TInt timeIndex = startObject.Property(*creationDateDef, startTime);
       
  1035             if( KErrNotFound == timeIndex )
       
  1036                 {
       
  1037                 User::Leave(KErrCorrupt);
       
  1038                 }
       
  1039             startMonth = static_cast<CMdETimeProperty*>(startTime)->Value();
       
  1040             CMdEProperty* endTime;
       
  1041             CMdEObject& endObject = (CMdEObject&)query->ResultItem(query->Count()-1);
       
  1042             timeIndex = endObject.Property(*creationDateDef, endTime);
       
  1043             if( KErrNotFound == timeIndex )
       
  1044                 {
       
  1045                 User::Leave(KErrCorrupt);
       
  1046                 }
       
  1047             endMonth = static_cast<CMdETimeProperty*>(endTime)->Value();
       
  1048             }
       
  1049         iQueryAttributes[0].iMedia->SetTObjectValueL(KGlxMediaCollectionInternalStartDate, startMonth);
       
  1050         iQueryAttributes[0].iMedia->SetTObjectValueL(KGlxMediaCollectionInternalEndDate, endMonth);
       
  1051         }
       
  1052     else if( EQueryResultModeCount == query->ResultMode() )
       
  1053         {
       
  1054         iQueryAttributes[0].iMedia->SetTObjectValueL(iQueryAttributes[0].iAttribute, query->Count());
       
  1055         }
       
  1056     else
       
  1057         {
       
  1058         Panic(EGlxPanicIllegalState);
       
  1059         }
       
  1060     iQueryAttributes.Remove(0);
       
  1061     }       
       
  1062 
       
  1063 // ----------------------------------------------------------------------------
       
  1064 // CGlxDataSourceTaskMde::DoHandleLocationQueryCompletedL
       
  1065 // ----------------------------------------------------------------------------
       
  1066 //
       
  1067 void CGlxDataSourceTaskMdeAttribute::DoHandleLocationQueryCompletedL()
       
  1068     {
       
  1069     GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeAttribute::DoHandleLocationQueryCompletedL()");
       
  1070     TInt queryResultsCount = iQueries[0]->Count();
       
  1071     
       
  1072     for (TInt queryResultsPos = 0; queryResultsPos < queryResultsCount; queryResultsPos++)
       
  1073         {
       
  1074         CMdERelation& relation = static_cast<CMdERelation&>(iQueries[0]->ResultItem(queryResultsPos));
       
  1075         CMPXMedia* targetMedia = NULL;
       
  1076         if (iMediaArray)
       
  1077             {
       
  1078             TInt mediaArrayCount = iMediaArray->Count();
       
  1079             for (TInt mediaArrayPos = 0; mediaArrayPos < mediaArrayCount; mediaArrayPos++)
       
  1080                 {
       
  1081                 CMPXMedia* media = (*iMediaArray)[mediaArrayPos];
       
  1082                 TMPXItemId id =  media->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId);
       
  1083                 if (id.iId1 == relation.LeftObjectId())
       
  1084                     {
       
  1085                     targetMedia = media;
       
  1086                     break;
       
  1087                     }
       
  1088                 }
       
  1089             }
       
  1090         else
       
  1091             {
       
  1092             targetMedia = iResponse;
       
  1093 #ifdef _DEBUG
       
  1094             TMPXItemId id =  targetMedia->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId);
       
  1095             __ASSERT_DEBUG(id.iId1 == relation.LeftObjectId(), Panic(EGlxPanicLogicError));
       
  1096 #endif
       
  1097             }
       
  1098         
       
  1099             __ASSERT_DEBUG(targetMedia, Panic(EGlxPanicLogicError));
       
  1100             AddLocationAttributeToMediaL(*targetMedia, relation.RightObjectId());
       
  1101           
       
  1102         }
       
  1103     }
       
  1104 
       
  1105 // ----------------------------------------------------------------------------
       
  1106 // CGlxDataSourceTaskMdeAttribute::DoHandleImageVideoQueryCompletedL
       
  1107 // ----------------------------------------------------------------------------
       
  1108 //
       
  1109 void CGlxDataSourceTaskMdeAttribute::DoHandleImageVideoQueryCompletedL()
       
  1110 	{
       
  1111     GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeAttribute::DoHandleImageVideoQueryCompletedL()");
       
  1112 	CMdEQuery* query = iQueries[0];
       
  1113 	
       
  1114     TInt queryResultsCount = query->Count();
       
  1115     
       
  1116     if( ( queryResultsCount == 1 ) && ( !iMediaArray ) )
       
  1117         {
       
  1118         CMdEObject& object = static_cast<CMdEObject&>(query->ResultItem(0));
       
  1119         
       
  1120         delete iResponse;
       
  1121         // setiing iResponse to NULL to remove CodeScanner warning
       
  1122         iResponse = NULL;
       
  1123         iResponse = CMPXMedia::NewL();
       
  1124         AddAttributesL(object, iResponse);
       
  1125         }
       
  1126     else
       
  1127         {    
       
  1128         for (TInt i = 0; i < queryResultsCount; i++)
       
  1129             {
       
  1130             CMdEObject& object = static_cast<CMdEObject&>(query->ResultItem(i));
       
  1131             
       
  1132             CMPXMedia* entry = CMPXMedia::NewL();
       
  1133             CleanupStack::PushL(entry);
       
  1134             iMediaArray->AppendL(entry);
       
  1135             CleanupStack::Pop(entry);
       
  1136             AddAttributesL(object, (*iMediaArray)[iMediaArray->Count() - 1]);
       
  1137             }
       
  1138         }    
       
  1139 	}
       
  1140 
       
  1141 // ----------------------------------------------------------------------------
       
  1142 // CGlxDataSourceTaskMdeAttribute::QueueLocaitonQueryL
       
  1143 // ----------------------------------------------------------------------------
       
  1144 //
       
  1145 void CGlxDataSourceTaskMdeAttribute::QueueLocaitonQueryL()
       
  1146     {
       
  1147     GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeAttribute::QueueLocaitonQueryL()");
       
  1148     __ASSERT_DEBUG(dynamic_cast<CGlxGetRequest*>(iRequest), Panic(EGlxPanicLogicError));
       
  1149     CGlxGetRequest* request = static_cast<CGlxGetRequest*>(iRequest);
       
  1150         
       
  1151     CMdEQuery* query = DataSource()->Session().NewRelationQueryL(*DataSource()->NamespaceDef(), this); 
       
  1152     CleanupStack::PushL(query);
       
  1153     
       
  1154     CMdELogicCondition& rootCondition = query->Conditions();
       
  1155     CMdERelationCondition& containerRelationCondition = rootCondition.AddRelationConditionL(DataSource()->ContainsDef(), ERelationConditionSideRight);
       
  1156     CMdELogicCondition& itemLogicCondition  = containerRelationCondition.LeftL();
       
  1157     CMdELogicCondition&  locationLogicCondition = containerRelationCondition.RightL();
       
  1158     locationLogicCondition.AddObjectConditionL(DataSource()->LocationDef());
       
  1159     locationLogicCondition.SetOperator(ELogicConditionOperatorOr);
       
  1160     itemLogicCondition.SetOperator(ELogicConditionOperatorOr);
       
  1161     
       
  1162     TInt mediaIdCount = request->MediaIds().Count();
       
  1163     
       
  1164     RArray<TItemId> mediaIdArray;
       
  1165     CleanupClosePushL(mediaIdArray);
       
  1166     
       
  1167     for (TInt i = 0; i < mediaIdCount; i++)
       
  1168         {
       
  1169         mediaIdArray.AppendL(request->MediaIds()[i].Value());
       
  1170         }
       
  1171     
       
  1172     itemLogicCondition.AddObjectConditionL(mediaIdArray);
       
  1173     CleanupStack::PopAndDestroy(&mediaIdArray);
       
  1174 
       
  1175     query->SetResultMode(EQueryResultModeItem);     
       
  1176     
       
  1177     CleanupStack::Pop(query);
       
  1178     AppendQueryL(query, ELocationAttributeQuery);
       
  1179     }
       
  1180 
       
  1181 // ----------------------------------------------------------------------------
       
  1182 // CGlxDataSourceTask::ExecuteQueryL
       
  1183 // ----------------------------------------------------------------------------
       
  1184 //
       
  1185 void CGlxDataSourceTaskMdeAttribute::ExecuteQueryL()
       
  1186     {
       
  1187     GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeAttribute::ExecuteQueryL()");
       
  1188     switch (iQueryTypes[0])
       
  1189         {
       
  1190         case EAttributeQuery:
       
  1191             {
       
  1192             iQueries[0]->FindL(MaxQueryResultsCount(iQueryAttributes[0].iFilterProperties));
       
  1193             }
       
  1194         break;
       
  1195         case EImageVideoQuery: // fall through
       
  1196         case ELocationAttributeQuery:
       
  1197             {
       
  1198             iQueries[0]->FindL();
       
  1199             }
       
  1200         break;
       
  1201         default:
       
  1202             {
       
  1203             Panic(EGlxPanicUnsupportedQueryType);
       
  1204             }
       
  1205         break;
       
  1206         }
       
  1207     }
       
  1208 
       
  1209 // ----------------------------------------------------------------------------
       
  1210 // CGlxDataSourceTaskMdeAttribute::LocationAttributeRequested
       
  1211 // ----------------------------------------------------------------------------
       
  1212 //
       
  1213 TBool CGlxDataSourceTaskMdeAttribute::LocationAttributeRequested()
       
  1214     {
       
  1215     GLX_LOG_ENTRY_EXIT("TBool CGlxDataSourceTaskMdeAttribute::LocationAttributeRequested()");
       
  1216     __ASSERT_DEBUG(dynamic_cast<CGlxGetRequest*>(iRequest), Panic(EGlxPanicLogicError));
       
  1217     CGlxGetRequest* request = static_cast<CGlxGetRequest*>(iRequest);
       
  1218     
       
  1219     TInt attributeArrayCount = request->Attributes().Count();
       
  1220     for (TInt i = 0; i < attributeArrayCount; i++)
       
  1221         {
       
  1222         if (request->Attributes()[i] == KGlxMediaGeneralLocation)
       
  1223             {
       
  1224             return ETrue;
       
  1225             }
       
  1226         }
       
  1227     return EFalse;
       
  1228     }
       
  1229 
       
  1230 // ----------------------------------------------------------------------------
       
  1231 // CGlxDataSourceTask::QueueObjectQueryL
       
  1232 // ----------------------------------------------------------------------------
       
  1233 //  
       
  1234 void CGlxDataSourceTaskMdeAttribute::QueueObjectQueryL(CMdEObjectDef& aObjectDef, TBool aIsContent, TGlxQueryType aQueryType, 
       
  1235         TQueryResultMode aResultMode, const TGlxMediaId& aContainerId, TMPXAttribute aAttribute, CMPXMedia* aEntry, 
       
  1236         const TGlxFilterProperties& aFilterProperties)
       
  1237     {
       
  1238     GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeAttribute::QueueObjectQueryL()");   
       
  1239     CMdEObjectDef* queryBaseObject = &aObjectDef;
       
  1240     if( aIsContent )
       
  1241         {
       
  1242         switch(aFilterProperties.iItemType)
       
  1243             {
       
  1244             case EGlxFilterImage: 
       
  1245                 {
       
  1246                 queryBaseObject = &DataSource()->ImageDef();
       
  1247                 break;
       
  1248                 }
       
  1249             case EGlxFilterVideo:
       
  1250                 {
       
  1251                 queryBaseObject = &DataSource()->VideoDef();
       
  1252                 break;
       
  1253                 }
       
  1254             default:
       
  1255                 {
       
  1256                 queryBaseObject = &DataSource()->ObjectDef();
       
  1257                 break;
       
  1258                 }
       
  1259             }
       
  1260         }
       
  1261 
       
  1262     CMdEQuery* query = DataSource()->Session().NewObjectQueryL(*DataSource()->NamespaceDef(), *queryBaseObject, this);
       
  1263     CleanupStack::PushL(query);
       
  1264     SetQueryConditionsL(*query, aFilterProperties, aContainerId, aObjectDef);
       
  1265     query->SetResultMode(aResultMode);
       
  1266   
       
  1267     iQueryAttributes.AppendL(TGlxQueryAttribute(aAttribute, aEntry, aFilterProperties));
       
  1268 
       
  1269     CleanupStack::Pop(query);
       
  1270     
       
  1271    	TRAPD(err, AppendQueryL(query,aQueryType));
       
  1272    	
       
  1273    	if (err != KErrNone)
       
  1274    		{
       
  1275    		iQueryAttributes.Remove(iQueryAttributes.Count() - 1);
       
  1276    		}
       
  1277     }