taskswitcher/server/src/tsiconproviderimp.cpp
author hgs
Mon, 18 Oct 2010 10:44:15 +0300
changeset 127 7b66bc3c6dc9
permissions -rw-r--r--
201041

/*
* Copyright (c) 2008 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:  Task list entry
*
*/
#include <fbs.h>
#include <apgcli.h>
#include <apgicnfl.h>
#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
#include <apaidpartner.h>
#else
#include <apaid.h>
#endif

#include <QPixmap>
#include <HbIcon>
#include <XQConversions>


#include "tsiconproviderimp.h"

// size for the created app icons
const TInt KAppIconWidth(128);
const TInt KAppIconHeight(128);
const TInt KImgExtLenght(3);
_LIT(KMbmExt, "mbm");

//------------------------------------------------------------------------------
CTsIconProvider* CTsIconProvider::NewL(MTsResourceManager& aResources)
    {
    CTsIconProvider* self = new(ELeave)CTsIconProvider(aResources);
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }

//------------------------------------------------------------------------------
CTsIconProvider::CTsIconProvider(MTsResourceManager& aResources)
:
    iResources(aResources)
    {
    //No implementation required
    }

//------------------------------------------------------------------------------
void CTsIconProvider::ConstructL()
    {
    QT_TRYCATCH_LEAVING(
        iDefaultIcon = Bitmap( HbIcon("qtg_large_application").qicon() );)
    User::LeaveIfNull(iDefaultIcon);
    }

//------------------------------------------------------------------------------
CTsIconProvider::~CTsIconProvider()
    {
    delete iDefaultIcon;
    }

//------------------------------------------------------------------------------
void CTsIconProvider::LoadIconL(CFbsBitmap& aDst, TUid aUid)
    {
    const TIconSource sources [] = {ESkin, EApparc, EFile, EDefault};
    const TInt count ( sizeof(sources) / sizeof(TIconSource) );
    if(0 == count)
        {
        User::Leave(KErrCorrupt);
        }
    TInt errNo(KErrNotFound);
    for(TInt offset(0); KErrNone != errNo && offset < count; ++offset)
        {
        TRAP( errNo, LoadL( sources[offset], aDst, aUid ) );
        }
    User::LeaveIfError(errNo);
    }

//------------------------------------------------------------------------------
CFbsBitmap* CTsIconProvider::Bitmap( const QIcon& aIcon )
    {
    CFbsBitmap* retValue(0);
    QPixmap pixmap = aIcon.pixmap( QSize(KAppIconWidth, KAppIconHeight) );
    if( !pixmap.isNull() )
        {
        retValue = pixmap.toSymbianCFbsBitmap();
        }
    return retValue;
    }
//------------------------------------------------------------------------------
CFbsBitmap* CTsIconProvider::Bitmap( CFbsBitmap& aBitmap, 
                                     CFbsBitmap& aMask )
    {
    QPixmap ico(QPixmap::fromSymbianCFbsBitmap(&aBitmap));
    ico.setAlphaChannel(QPixmap::fromSymbianCFbsBitmap(&aMask));
    return ico.scaled(QSize(KAppIconWidth, KAppIconHeight),
                      Qt::KeepAspectRatioByExpanding,
                      Qt::SmoothTransformation).toSymbianCFbsBitmap();
    
    }

//------------------------------------------------------------------------------
void CTsIconProvider::LoadL(TIconSource aSrc, CFbsBitmap& aDst, TUid aUid)
    {
    switch(aSrc)
        {
        case ESkin:LoadIconFromSkinL(aDst, aUid); break;
        case EApparc:LoadIconFromApparcL(aDst, aUid); break;
        case EFile: LoadIconFromFileL(aDst, aUid); break;
        case EDefault: LoadIconDefaultL(aDst); break;
        }
    }

//------------------------------------------------------------------------------
void CTsIconProvider::LoadIconFromSkinL(CFbsBitmap& aDst, TUid aUid)
    {
    CApaAppServiceInfoArray* skin =
        iResources.ApaSession().GetAppServiceOpaqueDataLC(aUid, TUid::Uid(0x2002DCF3));
    TArray<TApaAppServiceInfo> info( skin->Array() );
    if( 0 >= info.Count() )
        {
        User::Leave(KErrNotFound);
        }
    TPtrC8 opaque(info[0].OpaqueData());
    const TPtrC16 iconName((TText16*) opaque.Ptr(),(opaque.Length()+1)>>1);
    
    CFbsBitmap* ico(0);
    QT_TRYCATCH_LEAVING( 
    ico = Bitmap(HbIcon(XQConversions:: s60DescToQString(iconName)).qicon());)
    CopyAndDestroyL(aDst, ico);
    
    CleanupStack::PopAndDestroy(skin);
    }

//------------------------------------------------------------------------------
void CTsIconProvider::LoadIconFromApparcL(CFbsBitmap& aDst, TUid aUid)
    {
    const TSize size(KAppIconWidth, KAppIconHeight);
    CApaMaskedBitmap* bitmap = CApaMaskedBitmap::NewLC();
    User::LeaveIfError( iResources.ApaSession().GetAppIcon(aUid,size,*bitmap) );
    User::LeaveIfNull(bitmap->Mask());
    TInt iconsCount(0);
    iResources.ApaSession().NumberOfOwnDefinedIcons( aUid, iconsCount);
    if(0 >= iconsCount)
        {
        User::Leave(KErrNotFound);
        }
    
    CFbsBitmap *ico(0);
    QT_TRYCATCH_LEAVING(
        ico = Bitmap(*bitmap, *bitmap->Mask());)
    CopyAndDestroyL(aDst, ico);
    
    CleanupStack::PopAndDestroy(bitmap);
    }

//------------------------------------------------------------------------------
void CTsIconProvider::LoadIconFromFileL(CFbsBitmap& aDst, TUid aUid)
    {
    HBufC* fileName( 0 );
    User::LeaveIfError(iResources.ApaSession().GetAppIcon(aUid,fileName));
    CleanupStack::PushL(fileName);
    fileName->Des().LowerCase();
    if(0 == fileName->Right(KImgExtLenght).Compare(KMbmExt))
        {
        User::LeaveIfError( aDst.Load(*fileName) );
        }
    else
        {
        CFbsBitmap* ico(0);
        QT_TRYCATCH_LEAVING(
            ico = Bitmap(QIcon(XQConversions::s60DescToQString(*fileName)));)
        CopyAndDestroyL(aDst, ico);
        }
        
    CleanupStack::PopAndDestroy(fileName);
    }

//------------------------------------------------------------------------------
void CTsIconProvider::LoadIconDefaultL(CFbsBitmap& aDst)
    {
    User::LeaveIfError( aDst.Duplicate( iDefaultIcon->Handle() ) );
    }

//------------------------------------------------------------------------------
void CTsIconProvider::CopyAndDestroyL(CFbsBitmap& aDst, CFbsBitmap* aSrc)
    {
    User::LeaveIfNull(aSrc);
    CleanupStack::PushL(aSrc);
    User::LeaveIfError(aDst.Duplicate(aSrc->Handle()));
    CleanupStack::PopAndDestroy(aSrc);
    }