photosgallery/viewframework/medialists/inc/glxthumbnailcontext.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:33:26 +0100
branchRCL_3
changeset 60 5b3385a43d68
parent 0 4e91876724a2
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* 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:    Fetch context to retrieve thumbnails
*
*/




#ifndef C_GLXTHUMBNAILCONTEXT_H
#define C_GLXTHUMBNAILCONTEXT_H

#include <e32std.h>
#include "mglxfetchcontext.h"
#include "glxmedialistiterator.h"
#include <mglxresolutionchangeobserver.h>

// Forward declarations

class CGlxAttributeContext;
class CGlxDRMUtility;
class CGlxResolutionUtility;
class MGlxCache;
class MGlxMediaList;
class TGlxMedia;

/**
 *  CGlxThumbnailContext
 *
 *  Fetch context to retrieve thumbnails
 *
 *  @lib glxmedialists.lib
 */
class CGlxThumbnailContext : public CBase, public MGlxFetchContext,
        public MGlxResolutionChangeObserver
	{
public:
    /**
	 * Constructor
	 * @param aIterator Iterator that determines the order of thumbnail 
	 *  	  retrieval and for which items thumbnails are and are not retrieved
	 */
	IMPORT_C static CGlxThumbnailContext* NewL(MGlxMediaListIterator* aIterator);

	/**
	 * Constructor
	 * @param aIterator Iterator that determines the order of thumbnail 
	 *  	  retrieval and for which items thumbnails are and are not retrieved
	 */
	IMPORT_C CGlxThumbnailContext(MGlxMediaListIterator* aIterator);
	IMPORT_C ~CGlxThumbnailContext();

	/**
	 * Adds a fetch specification for an individual item
	 * @param aWidth the width of required bitmap. The context
	 *				 may retrieve first a thumbnail of difference size
	 *				 if it thinks it helps user experience.
	 * @param aHeight the width of required bitmap. 
	 * @param aFocusOffset Delta to focus. 0 means focus.
	 */
	IMPORT_C void AddSpecForItemL(TInt aWidth, TInt aHeight, TInt aFocusOffset);

	/**
	 * Sets the default fetch specification. The context uses this
	 * for all items that do not have a specific spec added.
	 * @param aWidth the width of required bitmap. The context
	 *				 may retrieve first a thumbnail of difference size
	 *				 if it thinks it helps user experience.
	 * @param aHeight the heigth of required bitmap. 
	 */
	IMPORT_C void SetDefaultSpec(TInt aWidth, TInt aHeight);

    /**
     * Set whether only high quality thumbnails are wanted.
     * @param aHighQualityOnly ETrue to skip fetching low quality thumbnails.
     */
    IMPORT_C void SetHighQualityOnly( TBool aHighQualityOnly );

public: // From MGlxFetchContext
    /// See @ref MGlxFetchContext::AttributeRequestL
    TInt AttributeRequestL(const MGlxMediaList* aList, RArray<TInt>& aItemIndices, 
    	RArray<TMPXAttribute>& aAttributes, CMPXAttributeSpecs*& aDetailedSpecs) const;

    /// See @ref MGlxFetchContext::AllAttributesL
    void AllAttributesL(const MGlxMediaList* aList, TInt aListIndex, 
    	RArray<TMPXAttribute>& aAttributes) const;

    /// See @ref MGlxFetchContext::RequestCountL
    TInt RequestCountL(const MGlxMediaList* aList) const;

protected:
    /**
    * 2nd phase construction
    */
    void ConstructL();

private:    // From MGlxResolutionChangeObserver
    void HandleResolutionChangedL();

private: 
        /**
         * Select the best thumbnail for processing
         *
         * @param aList pointer to media list
         * @param aError indication of any errors encountered when selecting item
         */
        TInt SelectItemL(const MGlxMediaList* aList, TInt& aError) const;

        /**
         * Calculates a score for thumbnail retrieval
         *
         * @param aIndexInList index of the item in the list
         * @param aList pointer to media list
         * @param aDistance Distance from highest priority index
         * @param aError indication of any errors encountered when calculating score
         *
         * @returns a score of how important processing this item's
         * 			thumbnail is. The higher, the more important.
         */
	TUint GetThumbnailScoreL(TInt aIndexInList, const MGlxMediaList* aList,
		TInt aDistance, TInt& aError) const;

    /** Item to specify what kind of thumbnail is needed */
    struct TFetchSpec
        {
        inline TFetchSpec() { iPossWidth = 0; iPossHeight = 0; };

        /** Width of the thumbnail */
        TReal32 iPossWidth;

        /** Height of the thumbnail */
        TReal32 iPossHeight;
        };

    /** 
    * Item to specify what kind of thumbnail is needed 
    * for which item (compared to focus)
    */
    struct TAssignedFetchSpec : public TFetchSpec
        {
        inline TAssignedFetchSpec() { iFocusOffset = 0; };

        /** Compares two specs by focus offset. Used for RArray::Find() */
        static TBool Match( const TAssignedFetchSpec& aSpec1,
                            const TAssignedFetchSpec& aSpec2 );

        /** Delta to focus. If zero, then focused item */
        TInt iFocusOffset;
        };

    /**
     * Get the fetch spec to be used for a given media item.
     * @param aListIndex Index of current item
     * @param aList Pointer to media list
     * @return Reference to fetch spec to use for the given item.
     */
    const TFetchSpec& SpecForIndex(TInt aListIndex,
                                    const MGlxMediaList* aList) const;

    /**
     * Get the size in pixels for a fetch spec.
     * @param aSpec Reference to fetch spec.
     * @return Size in pixels for the current screen resolution.
     */
    TSize SizeFromSpec( const TFetchSpec& aSpec ) const;

    /**
     * Check whether a given item has any full thumbnail attributes.
     * @param aItem Media item to check.
     * @return ETrue if a full thumbnail attribute is present.
     */
    TBool HasFullThumbnail( const TGlxMedia& aItem ) const;

    /**
     * Check DRM status of item at given index. Updates the fetch spec
     * for an item with invalid DRM
     * @param aListIndex index of current item
     * @param aList pointer to media list
     * @param aSpec reference to fetch spec
	 * @return ETrue if the item at index is not protected or has valid rights
     */
    TBool CheckDRMStatusL( TInt aListIndex, const MGlxMediaList* aList,
                                        TSize& aSize ) const;           

private:
    /** Specs applies to individual items */
    RArray<TAssignedFetchSpec> iSpecs;

    /** Request spec that is applied to all other items than in iSpecs */
    TFetchSpec iDefaultSpec;

    /** Whether to skip fetching low quality thumbnails */
    TBool iHighQualityOnly;

    /** Iterator for traversing the list */
    MGlxMediaListIterator* iIterator;	

    /** Cache manager interface (owned) */
    MGlxCache* iCache;

    /** Utility to translate between pixels and poss units */
    CGlxResolutionUtility* iResolutionUtility;

    /** DRM utility for checking rights */
    CGlxDRMUtility* iDrmUtility;

    /** Attribute context to fetch DRM attributes */
    CGlxAttributeContext* iDrmFetchContext;
    
    /** Size of the default spec */
    TSize iDefaultSpecSize;
    };

/**
 *  CGlxDefaultAttributeContext
 *
 *  Fetch context to retrieve MPX attributes starting from focus outward
 *
 *  @lib glxmedialists.lib
 */
class CGlxDefaultThumbnailContext : public CGlxThumbnailContext
	{
public:
	IMPORT_C static CGlxDefaultThumbnailContext* NewL();
	IMPORT_C ~CGlxDefaultThumbnailContext();

	/**
	 * Set the range offsets. These determine the outer limits
	 * of attributes to be retrieved, compared to current focus in
	 * the list
	 * If ranges not defined, retrieves the attributes for focused item only
	 */
    IMPORT_C void SetRangeOffsets(TInt aFrontOffset, TInt aRearOffset);

private:
	CGlxDefaultThumbnailContext();

private:
	TGlxFromFocusOutwardIterator iFromFocusIterator;	
	};

#endif // C_GLXTHUMBNAILCONTEXT_H