services/terminalmodeservice/src/upnptmiconmapping.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 16:06:48 +0300
branchRCL_3
changeset 29 5c72fd91570d
permissions -rw-r--r--
Revision: 201029 Kit: 201035

/**
* Copyright (c) 2010 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: CUpnpTmIconMapping class implementation.
*
*/

//Include Files  

#include "upnptmiconmapping.h"
#include "OstTraceDefinitions.h"
#ifdef OST_TRACE_COMPILER_IN_USE
#include "upnptmiconmappingTraces.h"
#endif
   

_LIT8(KSvgMimeType,     "image/svg+xml");  

// ================= MEMBER FUNCTIONS ==============================================

// ---------------------------------------------------------------------------------
// CUpnpTmIconMapping::NewL
// Two-phased constructor.
// ---------------------------------------------------------------------------------
//
CUpnpTmIconMapping* CUpnpTmIconMapping::NewL( )
    {
    OstTraceFunctionEntry0( CUPNPTMICONMAPPING_NEWL_ENTRY );
    CUpnpTmIconMapping* self = new (ELeave) CUpnpTmIconMapping(); 
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);
    OstTraceFunctionExit0( CUPNPTMICONMAPPING_NEWL_EXIT );
    return self; 
    }


// ---------------------------------------------------------------------------------
// CUpnpTmIconMapping::CUpnpTmIconMapping
// C++ default constructor can NOT contain any code, that
// might leave.
// ---------------------------------------------------------------------------------
//
CUpnpTmIconMapping::CUpnpTmIconMapping( )
     {

     }

// ---------------------------------------------------------------------------------
// CUpnpTmIconMapping::ConstructL
// Symbian 2nd phase constructor can leave.
// ---------------------------------------------------------------------------------
//
void CUpnpTmIconMapping::ConstructL()
    {
    OstTraceFunctionEntry0( CUPNPTMICONMAPPING_CONSTRUCTL_ENTRY );
    iFileUrlArray = new ( ELeave ) CDesC8ArrayFlat( KExpectedMaxIconParms  );
    iFilePathArray = new ( ELeave ) CDesCArrayFlat( KExpectedMaxIconParms );
    OstTraceFunctionExit0( CUPNPTMICONMAPPING_CONSTRUCTL_EXIT );
    }

// ---------------------------------------------------------------------------------
// CUpnpTmIconMapping::~CUpnpTmIconMapping
// Destructor
// ---------------------------------------------------------------------------------
//
CUpnpTmIconMapping::~CUpnpTmIconMapping()
    {
    OstTraceFunctionEntry0( CUPNPTMICONMAPPING_CUPNPTMICONMAPPING_ENTRY );
    if ( iFileUrlArray )
        {
        iFileUrlArray->Reset();
        delete iFileUrlArray;
        }
    if ( iFilePathArray )
        {
        iFilePathArray->Reset();
        delete iFilePathArray;
        }   
    iWidthArray.Close();
    iHeightArray.Close();
    OstTraceFunctionExit0( CUPNPTMICONMAPPING_CUPNPTMICONMAPPING_EXIT );
    }

// ---------------------------------------------------------------------------------
// CUpnpTmIconMapping::AddIconFileInfoL
// Method is used to store information about each application icon which can be 
// used to fetch iconPath for the corresponding iconUrl and to determine whether  
// conversion is needed or not.
// @param aUrl     Iccon URL.
// @param aPath    Icon Path.
// @param aWidth   Width of the icon.
// @param aHeight  Height of the icon.
// -------------------------------------------------------------------------------------
//
void CUpnpTmIconMapping::AddIconFileInfoL( const TDesC8& aUrl, const TDesC& aPath, 
                                                        TInt aWidth, TInt aHeight )
    {
    OstTraceFunctionEntry0( CUPNPTMICONMAPPING_ADDICONFILEINFOL_ENTRY );
    iFileUrlArray->AppendL( aUrl );
    iFilePathArray->AppendL( aPath );
    iWidthArray.AppendL( aWidth );
    iHeightArray.AppendL( aHeight );
    OstTraceFunctionExit0( CUPNPTMICONMAPPING_ADDICONFILEINFOL_EXIT );
    }

// ---------------------------------------------------------------------------------
// CUpnpTmIconMapping::GetSvgIconPath
// Method is used to fetch the equivalent icon path for the requested icon url
// @param aUrl  iconUrl
// @param aSvgFilePath[out]  iconPath
// @return   Returns the position of the filepath in the array if found else 
//           returns KErrNotFound.
// ---------------------------------------------------------------------------------
//
TInt CUpnpTmIconMapping::GetSvgIconPath( const TDesC8& aUrl,RBuf& aSvgFilePath )
    {
    OstTraceFunctionEntry0( CUPNPTMICONMAPPING_GETSVGICONPATH_ENTRY );
    TInt pos;
    if ( iFileUrlArray->Find(aUrl,pos) == KErrNone )
        {
        aSvgFilePath.Close();
        aSvgFilePath.Create((*iFilePathArray)[pos]);
        }
    else
        {
        // The requested file is not available
        pos = KErrNotFound;
        }
    OstTraceFunctionExit0( CUPNPTMICONMAPPING_GETSVGICONPATH_EXIT );
    return pos;
    }

// ---------------------------------------------------------------------------------
// CUpnpTmIconMapping::IsConversionNeeded
// Method is used to fetch the dimensions of the icon which needs to be served and 
// also return the information whether conversion is needed for a particular icon.
// @param aIndex   Index of the icon filepath
// @param aClientIconPref   Reference to Client Icon Preference object.
// @param[out] aIconWidth   Width of the icon which needs to be sent.
// @param[out] aIconHeight  Height of the icon which needs to be sent.
// @return  Returns the boolean value for conversion is needed(true) or not(false).
// ---------------------------------------------------------------------------------
//
TBool CUpnpTmIconMapping::IsConversionNeeded( TInt aIndex, const CUpnpTmClientIconPref& aClientIconPref,
                                                                   TInt& aIconWidth, TInt& aIconHeight )
    {
    OstTraceFunctionEntry0( CUPNPTMICONMAPPING_ISCONVERSIONNEEDED_ENTRY );
    ASSERT( ( aIndex >= 0 ) && ( aIndex < iWidthArray.Count()) );
    TBool isConversionNeeded(ETrue);
    // Fetch the client's icon preferences
    const TDesC8& mimeType = aClientIconPref.MimeType();
    TInt iconWidth  = aClientIconPref.Width();
    TInt iconHeight = aClientIconPref.Height();
    OstTraceExt2( TRACE_NORMAL, DUP1_CUPNPTMICONMAPPING_ISCONVERSIONNEEDED, "CUpnpTmIconMapping::IsConversionNeeded;iconWidth=%d;iconHeight=%d", iconWidth, iconHeight );

    if ( mimeType.Compare(KSvgMimeType) == KErrNone )
        {
        // Client supports "image/svg+xml" mime type icons
        if ((( iconWidth == KErrNone ) || ( iconWidth == iWidthArray[aIndex] )) && 
            (( iconHeight == KErrNone ) || ( iconHeight == iHeightArray[aIndex] )))
            {
            /* Either the client has not provided its dimension preferences or 
               preferred width and height also matches. So no conversion needed */
            isConversionNeeded = EFalse;
            }
        }
    /* 
     * If the width and height fields are set properly then only use the client's 
     * specified icon dimensions else use the icon's original dimensions.
     */
    if ( isConversionNeeded && iconWidth && iconHeight )
        {
        // Use the dimensions specified by the client
        aIconWidth  = iconWidth;
        aIconHeight = iconHeight;  
        }
    else
        {
        // Use original dimensions
        aIconWidth  = iWidthArray[aIndex];
        aIconHeight = iHeightArray[aIndex]; 
        } 
    OstTraceExt2( TRACE_NORMAL, CUPNPTMICONMAPPING_ISCONVERSIONNEEDED, "CUpnpTmIconMapping::IsConversionNeeded;aIconWidth=%d;aIconHeight=%d", aIconWidth, aIconHeight );
    OstTraceFunctionExit0( CUPNPTMICONMAPPING_ISCONVERSIONNEEDED_EXIT );
    return isConversionNeeded;
    }