photosgallery/collectionframework/plugins/tagcollectionplugin/src/glxcollectionplugintags.cpp
changeset 0 4e91876724a2
child 18 bcb43dc84c44
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/photosgallery/collectionframework/plugins/tagcollectionplugin/src/glxcollectionplugintags.cpp	Thu Dec 17 08:45:44 2009 +0200
@@ -0,0 +1,364 @@
+/*
+* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:    Tag collection plugin implementation
+*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "glxcollectionplugintags.h"
+#include "glxcollectionplugintags.hrh"
+
+ 
+#include <mpxmediageneraldefs.h>        //KMPXMediaIdGeneral
+#include <mpxmediacontainerdefs.h>      //Attributes for KMPXMediaIdContainer
+#include <StringLoader.h>
+#include <glxplugintags.rsg>
+#include <mglxdatasource.h>         //MGlxDataSource
+#include <glxlog.h>                 //For Logging
+#include <glxtracer.h>
+
+_LIT(KResourceFile, "z:glxplugintags.rsc");
+/**
+ * @internal reviewed 14/06/2007 by Alex Birkett
+ */
+
+// ----------------------------------------------------------------------------
+// Two-Phased Constructor
+// ----------------------------------------------------------------------------
+
+CGlxCollectionPluginTags* CGlxCollectionPluginTags::NewL(TAny* aObs)
+    {    
+    TRACER("CGlxCollectionPluginTags::NewL");
+
+    CGlxCollectionPluginTags* self = new (ELeave) CGlxCollectionPluginTags(
+                                static_cast<MMPXCollectionPluginObserver*>(aObs));
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+    
+    
+// ----------------------------------------------------------------------------
+// Destructor
+// ----------------------------------------------------------------------------
+//
+ CGlxCollectionPluginTags::~CGlxCollectionPluginTags()
+    {
+    //Do Nothing
+    }
+ 	
+ 	
+// ----------------------------------------------------------------------------
+// Constructor
+// ----------------------------------------------------------------------------
+void CGlxCollectionPluginTags::ConstructL()
+    {            
+    TRACER("CGlxCollectionPluginTags::ConstructL");
+
+    // iDataSource - @owner is CGlxCollectionPluginBase
+    iDataSource = MGlxDataSource::OpenDataSourceL(KGlxDefaultDataSourceUid, *this);     
+    }
+    
+    
+// ----------------------------------------------------------------------------
+//  Constructor
+// ----------------------------------------------------------------------------
+
+CGlxCollectionPluginTags::CGlxCollectionPluginTags(
+    MMPXCollectionPluginObserver* aObs)
+    {
+    iObs = aObs;
+    }
+
+
+// ----------------------------------------------------------------------------
+// Add Additional attributes
+// ----------------------------------------------------------------------------
+
+void CGlxCollectionPluginTags::CpiAttributeAdditionalAttributes(
+				const TMPXAttribute& aCpiAttribute, RArray<TMPXAttribute>& aAttributeArray)
+	{
+    TRACER("CGlxCollectionPluginTags::CpiAttributeAdditionalAttributes");  
+    // Only need to process KGlxMediaCollectionPluginSpecificSubTitle here as all
+    // the others are reading straight from resource files
+    // KGlxMediaCollectionPluginSpecificSubTitle requires a usage count
+	if (aCpiAttribute == KGlxMediaCollectionPluginSpecificSubTitle)
+	    {
+	    // need to add the usage count. but check first if it is already present
+	    TInt attrCount = aAttributeArray.Count();
+	    TBool found = EFalse;
+	    
+	    GLX_DEBUG1("CGlxCollectionPluginTags::CpiAttributeAdditionalAttributes-AttributesCount");  
+	    
+	    for ( TInt index = 0 ; index < attrCount ; index++)
+	        {
+	        if (aAttributeArray[index] == KMPXMediaGeneralCount)
+	            {
+	            found = ETrue;
+	            break;
+	            }
+	        }
+	        
+	    if (!found)
+	        {
+	        aAttributeArray.Append(KMPXMediaGeneralCount);
+	        }
+	    }
+	}
+
+
+// ----------------------------------------------------------------------------
+// Modify the response
+// ----------------------------------------------------------------------------
+
+void CGlxCollectionPluginTags::HandleCpiAttributeResponseL(CMPXMedia* aResponse, 
+				TArray<TMPXAttribute> aCpiAttributes, TArray<TGlxMediaId> aMediaIds)
+	{
+    TRACER("CGlxCollectionPluginTags::HandleCpiAttributeResponseL");  
+    const TInt mediaIdCount = aMediaIds.Count();
+    
+    switch (mediaIdCount)
+        {
+    case 0:
+            User::Leave(KErrNotSupported);
+            break;
+        
+    case 1:
+            GLX_LOG_INFO("CGlxCollectionPluginTags::HandleCpiAttributeResponseL-MediaID");  
+    	
+            HandleCpiAttributeResponseL(aResponse, aCpiAttributes, aMediaIds[0]);
+            break;
+        
+        
+    default:
+            {
+            // We have an array of CMPXMedia items
+            
+            if (TGlxMediaId(KGlxCollectionRootId) == aMediaIds[0])
+                {
+                User::Leave(KErrNotSupported);
+                }
+                
+            CMPXMediaArray* mediaArray = aResponse->ValueCObjectL<CMPXMediaArray>(KMPXMediaArrayContents);
+            CleanupStack::PushL(mediaArray);
+
+            const TInt arrayCount = mediaArray->Count();
+            
+            // Sanity check
+        	if (arrayCount != mediaIdCount)
+        	    {
+                User::Leave(KErrArgument);
+        	    }
+        	
+            for (TInt index = 0; index < arrayCount; index++)
+                {
+                HandleCpiAttributeResponseL((*mediaArray)[index], aCpiAttributes, 
+                						aMediaIds[index]);
+                }
+
+			 /// @todo - Can we reset a value. Does it overwrite the original or does it leak? Must test
+            aResponse->SetCObjectValueL(KMPXMediaArrayContents, mediaArray);        
+            CleanupStack::PopAndDestroy(mediaArray);
+            }
+        break;
+        }
+	}
+	
+	
+// ----------------------------------------------------------------------------
+// Modify the response
+// ----------------------------------------------------------------------------	
+
+void CGlxCollectionPluginTags::HandleCpiAttributeResponseL(CMPXMedia* aResponse,
+			 TArray<TMPXAttribute> aCpiAttributes, TGlxMediaId aMediaId)
+    {
+    
+    TRACER("CGlxCollectionPluginTags::HandleCpiAttributeResponseL-Enter");  
+
+    const TInt attribCount = aCpiAttributes.Count();
+	
+    GLX_LOG_INFO("CGlxCollectionPluginTags::HandleCpiAttributeResponseL-Attributes created");
+	
+	for (TInt index = 0; index < attribCount ; index++)
+	    {
+	    const TMPXAttribute attr = aCpiAttributes[index];
+	    
+	    if (attr == KGlxMediaCollectionPluginSpecificSubTitle)
+	        {
+            GLX_LOG_INFO("CGlxCollectionPluginTags::HandleCpiAttributeResponseL-Subtitle");
+	        
+	        if (!aResponse->IsSupported(KMPXMediaGeneralCount))
+	            {
+	            User::Leave(KErrNotSupported);
+	            }
+            else
+                {
+                TInt usageCount = aResponse->ValueTObjectL<TInt>(KMPXMediaGeneralCount);
+                HBufC* tempTitle = NULL;
+                
+                if (TGlxMediaId(KGlxCollectionRootId) == aMediaId)
+                	{
+                	if(0 == usageCount)
+                		{
+                    	tempTitle = LoadLocalizedStringLC(KResourceFile, 
+                    			R_TAG_SUB_TITLE_NO_ITEMS);                    	
+                    	// Set the title in the response.
+                		aResponse->SetTextValueL(attr, *tempTitle);  
+                		CleanupStack::PopAndDestroy(tempTitle);
+                		continue;  
+                		}
+                	else if (1 == usageCount)
+                    	{
+                    	tempTitle = LoadLocalizedStringLC(KResourceFile,
+                   			 R_TAG_SUB_TITLE_SINGLE);
+                        aResponse->SetTextValueL(attr, *tempTitle);  
+                        CleanupStack::PopAndDestroy(tempTitle);
+                        continue;
+                    	}
+                    else 
+                    	{
+                    	tempTitle = LoadLocalizedStringLC(KResourceFile,
+                   			 R_TAG_SUB_TITLE_MULTI);
+                    	}
+                	}
+                else
+                	{
+                	if(0 == usageCount)
+                		{
+                    	tempTitle = LoadLocalizedStringLC(KResourceFile, 
+                    			R_TAG_SUB_TITLE_NO_ITEMS);                    	
+                    	// Set the title in the response.
+                		aResponse->SetTextValueL(attr, *tempTitle);  
+                		CleanupStack::PopAndDestroy(tempTitle);
+                		continue;  
+                		}
+                	else if (1 == usageCount)
+                		{
+                		tempTitle = LoadLocalizedStringLC(KResourceFile,
+                   			 R_TAG_ITEM_SUB_TITLE_SINGLE);
+                        aResponse->SetTextValueL(attr, *tempTitle);  
+                        CleanupStack::PopAndDestroy(tempTitle);
+                        continue;
+                		}
+                    else
+                        {
+                        tempTitle = LoadLocalizedStringLC(KResourceFile,
+                        			 R_TAG_ITEM_SUB_TITLE_MULTI);
+                        }
+                    }
+                TPtr formatString = tempTitle->Des();
+                
+                // Now create a buffer that will contain the result. needs to be length 
+                //of format string plus a few extra for the number
+                HBufC* title = HBufC::NewLC(formatString.Length() + 10);
+                TPtr ptr = title->Des();
+                StringLoader::Format(ptr, formatString, -1, usageCount);
+                
+                // Set the title in the response.
+                aResponse->SetTextValueL(attr, *title);    
+
+                CleanupStack::PopAndDestroy(title);
+                CleanupStack::PopAndDestroy(tempTitle);
+                }
+	        }
+	    else if (attr == KGlxMediaCollectionPluginSpecificSelectMediaPopupTitle)
+	        {
+            GLX_LOG_INFO("CGlxCollectionPluginTags::HandleCpiAttributeResponseL-Popup Title");
+	        
+	        HBufC* title = LoadLocalizedStringLC(KResourceFile, R_TAG_POPUP_TITLE);
+            aResponse->SetTextValueL(attr, *title);  
+            CleanupStack::PopAndDestroy(title);
+            
+	        }
+	    else if (attr == KGlxMediaCollectionPluginSpecificNewMediaItemTitle)
+	        {
+            GLX_LOG_INFO("CGlxCollectionPluginTags::HandleCpiAttributeResponseL-Mediaitem");
+	        
+	        HBufC* title = LoadLocalizedStringLC(KResourceFile, R_TAG_ITEM_TITLE);
+            aResponse->SetTextValueL(attr, *title);  
+            CleanupStack::PopAndDestroy(title);
+            
+	        }
+	        
+	    else if (attr == KGlxMediaCollectionPluginSpecificDefaultMediaTitle)
+	        {
+            GLX_LOG_INFO("CGlxCollectionPluginTags::HandleCpiAttributeResponseL-Defualt mediatitle");
+	        
+	        HBufC* title = LoadLocalizedStringLC(KResourceFile, R_TAG_DEFAULT_TITLE);
+            aResponse->SetTextValueL(attr, *title);  
+            CleanupStack::PopAndDestroy(title);
+            
+	        }
+	    else if (attr == KMPXMediaGeneralTitle)
+	        {
+            GLX_LOG_INFO("CGlxCollectionPluginTags::HandleCpiAttributeResponseL-Attr Title");
+	        
+	        HBufC* title = LoadLocalizedStringLC(KResourceFile, R_TAG_GENERAL_TITLE);
+            aResponse->SetTextValueL(attr, *title);  
+            CleanupStack::PopAndDestroy(title); 
+	        }
+	    }
+    }
+
+// ----------------------------------------------------------------------------
+// Ignore the Updated Message
+// ----------------------------------------------------------------------------	
+TBool CGlxCollectionPluginTags::IsUpdateMessageIgnored(CMPXMessage& /*aMessage*/)
+	{
+	TRACER("CGlxCollectionPluginTags::IsUpdateMessageIgnored");  
+	TBool ignore = EFalse;
+	return ignore;
+	}
+
+// ----------------------------------------------------------------------------
+// Set the filter Properties
+// ----------------------------------------------------------------------------	
+
+TGlxFilterProperties CGlxCollectionPluginTags::DefaultFilter(TInt aLevel)
+    {
+    TRACER("CGlxCollectionPluginTags::DefaultFilter"); 
+    __ASSERT_DEBUG(( (aLevel == KGlxCollectionRootLevel) || (aLevel == KGlxCollectionTagLevel) 
+                || (aLevel == KGlxCollectionTagContentsLevel) || (aLevel == KGlxCollectionTagFSContentsLevel)),
+                 Panic(EGlxPanicInvalidPathLevel));
+    TGlxFilterProperties filterProperties;
+    filterProperties.iSortDirection = EGlxFilterSortDirectionAscending;
+    switch(aLevel)
+        {
+        case KGlxCollectionRootLevel:
+        case KGlxCollectionTagLevel: 
+            {
+            filterProperties.iMinCount = 1;
+            filterProperties.iSortOrder = EGlxFilterSortOrderAlphabetical;
+            filterProperties.iItemType = EGlxFilterTag;
+
+            break;
+            }
+        case KGlxCollectionTagContentsLevel:
+	        {
+        	filterProperties.iSortDirection = EGlxFilterSortDirectionDescending;
+	        }
+        case KGlxCollectionTagFSContentsLevel:
+            {
+            filterProperties.iSortOrder = EGlxFilterSortOrderCaptureDate;
+            break;
+            }
+        }
+    return filterProperties;
+    }
+    
+//End of File