taskswitcher/server/src/tsiconproviderimp.cpp
author hgs
Mon, 18 Oct 2010 10:44:15 +0300
changeset 127 7b66bc3c6dc9
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
127
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  Task list entry
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
#include <fbs.h>
hgs
parents:
diff changeset
    18
#include <apgcli.h>
hgs
parents:
diff changeset
    19
#include <apgicnfl.h>
hgs
parents:
diff changeset
    20
#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
hgs
parents:
diff changeset
    21
#include <apaidpartner.h>
hgs
parents:
diff changeset
    22
#else
hgs
parents:
diff changeset
    23
#include <apaid.h>
hgs
parents:
diff changeset
    24
#endif
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
#include <QPixmap>
hgs
parents:
diff changeset
    27
#include <HbIcon>
hgs
parents:
diff changeset
    28
#include <XQConversions>
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
#include "tsiconproviderimp.h"
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
// size for the created app icons
hgs
parents:
diff changeset
    34
const TInt KAppIconWidth(128);
hgs
parents:
diff changeset
    35
const TInt KAppIconHeight(128);
hgs
parents:
diff changeset
    36
const TInt KImgExtLenght(3);
hgs
parents:
diff changeset
    37
_LIT(KMbmExt, "mbm");
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
    40
CTsIconProvider* CTsIconProvider::NewL(MTsResourceManager& aResources)
hgs
parents:
diff changeset
    41
    {
hgs
parents:
diff changeset
    42
    CTsIconProvider* self = new(ELeave)CTsIconProvider(aResources);
hgs
parents:
diff changeset
    43
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    44
    self->ConstructL();
hgs
parents:
diff changeset
    45
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    46
    return self;
hgs
parents:
diff changeset
    47
    }
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
    50
CTsIconProvider::CTsIconProvider(MTsResourceManager& aResources)
hgs
parents:
diff changeset
    51
:
hgs
parents:
diff changeset
    52
    iResources(aResources)
hgs
parents:
diff changeset
    53
    {
hgs
parents:
diff changeset
    54
    //No implementation required
hgs
parents:
diff changeset
    55
    }
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
    58
void CTsIconProvider::ConstructL()
hgs
parents:
diff changeset
    59
    {
hgs
parents:
diff changeset
    60
    QT_TRYCATCH_LEAVING(
hgs
parents:
diff changeset
    61
        iDefaultIcon = Bitmap( HbIcon("qtg_large_application").qicon() );)
hgs
parents:
diff changeset
    62
    User::LeaveIfNull(iDefaultIcon);
hgs
parents:
diff changeset
    63
    }
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
    66
CTsIconProvider::~CTsIconProvider()
hgs
parents:
diff changeset
    67
    {
hgs
parents:
diff changeset
    68
    delete iDefaultIcon;
hgs
parents:
diff changeset
    69
    }
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
    72
void CTsIconProvider::LoadIconL(CFbsBitmap& aDst, TUid aUid)
hgs
parents:
diff changeset
    73
    {
hgs
parents:
diff changeset
    74
    const TIconSource sources [] = {ESkin, EApparc, EFile, EDefault};
hgs
parents:
diff changeset
    75
    const TInt count ( sizeof(sources) / sizeof(TIconSource) );
hgs
parents:
diff changeset
    76
    if(0 == count)
hgs
parents:
diff changeset
    77
        {
hgs
parents:
diff changeset
    78
        User::Leave(KErrCorrupt);
hgs
parents:
diff changeset
    79
        }
hgs
parents:
diff changeset
    80
    TInt errNo(KErrNotFound);
hgs
parents:
diff changeset
    81
    for(TInt offset(0); KErrNone != errNo && offset < count; ++offset)
hgs
parents:
diff changeset
    82
        {
hgs
parents:
diff changeset
    83
        TRAP( errNo, LoadL( sources[offset], aDst, aUid ) );
hgs
parents:
diff changeset
    84
        }
hgs
parents:
diff changeset
    85
    User::LeaveIfError(errNo);
hgs
parents:
diff changeset
    86
    }
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
    89
CFbsBitmap* CTsIconProvider::Bitmap( const QIcon& aIcon )
hgs
parents:
diff changeset
    90
    {
hgs
parents:
diff changeset
    91
    CFbsBitmap* retValue(0);
hgs
parents:
diff changeset
    92
    QPixmap pixmap = aIcon.pixmap( QSize(KAppIconWidth, KAppIconHeight) );
hgs
parents:
diff changeset
    93
    if( !pixmap.isNull() )
hgs
parents:
diff changeset
    94
        {
hgs
parents:
diff changeset
    95
        retValue = pixmap.toSymbianCFbsBitmap();
hgs
parents:
diff changeset
    96
        }
hgs
parents:
diff changeset
    97
    return retValue;
hgs
parents:
diff changeset
    98
    }
hgs
parents:
diff changeset
    99
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
   100
CFbsBitmap* CTsIconProvider::Bitmap( CFbsBitmap& aBitmap, 
hgs
parents:
diff changeset
   101
                                     CFbsBitmap& aMask )
hgs
parents:
diff changeset
   102
    {
hgs
parents:
diff changeset
   103
    QPixmap ico(QPixmap::fromSymbianCFbsBitmap(&aBitmap));
hgs
parents:
diff changeset
   104
    ico.setAlphaChannel(QPixmap::fromSymbianCFbsBitmap(&aMask));
hgs
parents:
diff changeset
   105
    return ico.scaled(QSize(KAppIconWidth, KAppIconHeight),
hgs
parents:
diff changeset
   106
                      Qt::KeepAspectRatioByExpanding,
hgs
parents:
diff changeset
   107
                      Qt::SmoothTransformation).toSymbianCFbsBitmap();
hgs
parents:
diff changeset
   108
    
hgs
parents:
diff changeset
   109
    }
hgs
parents:
diff changeset
   110
hgs
parents:
diff changeset
   111
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
   112
void CTsIconProvider::LoadL(TIconSource aSrc, CFbsBitmap& aDst, TUid aUid)
hgs
parents:
diff changeset
   113
    {
hgs
parents:
diff changeset
   114
    switch(aSrc)
hgs
parents:
diff changeset
   115
        {
hgs
parents:
diff changeset
   116
        case ESkin:LoadIconFromSkinL(aDst, aUid); break;
hgs
parents:
diff changeset
   117
        case EApparc:LoadIconFromApparcL(aDst, aUid); break;
hgs
parents:
diff changeset
   118
        case EFile: LoadIconFromFileL(aDst, aUid); break;
hgs
parents:
diff changeset
   119
        case EDefault: LoadIconDefaultL(aDst); break;
hgs
parents:
diff changeset
   120
        }
hgs
parents:
diff changeset
   121
    }
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
   124
void CTsIconProvider::LoadIconFromSkinL(CFbsBitmap& aDst, TUid aUid)
hgs
parents:
diff changeset
   125
    {
hgs
parents:
diff changeset
   126
    CApaAppServiceInfoArray* skin =
hgs
parents:
diff changeset
   127
        iResources.ApaSession().GetAppServiceOpaqueDataLC(aUid, TUid::Uid(0x2002DCF3));
hgs
parents:
diff changeset
   128
    TArray<TApaAppServiceInfo> info( skin->Array() );
hgs
parents:
diff changeset
   129
    if( 0 >= info.Count() )
hgs
parents:
diff changeset
   130
        {
hgs
parents:
diff changeset
   131
        User::Leave(KErrNotFound);
hgs
parents:
diff changeset
   132
        }
hgs
parents:
diff changeset
   133
    TPtrC8 opaque(info[0].OpaqueData());
hgs
parents:
diff changeset
   134
    const TPtrC16 iconName((TText16*) opaque.Ptr(),(opaque.Length()+1)>>1);
hgs
parents:
diff changeset
   135
    
hgs
parents:
diff changeset
   136
    CFbsBitmap* ico(0);
hgs
parents:
diff changeset
   137
    QT_TRYCATCH_LEAVING( 
hgs
parents:
diff changeset
   138
    ico = Bitmap(HbIcon(XQConversions:: s60DescToQString(iconName)).qicon());)
hgs
parents:
diff changeset
   139
    CopyAndDestroyL(aDst, ico);
hgs
parents:
diff changeset
   140
    
hgs
parents:
diff changeset
   141
    CleanupStack::PopAndDestroy(skin);
hgs
parents:
diff changeset
   142
    }
hgs
parents:
diff changeset
   143
hgs
parents:
diff changeset
   144
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
   145
void CTsIconProvider::LoadIconFromApparcL(CFbsBitmap& aDst, TUid aUid)
hgs
parents:
diff changeset
   146
    {
hgs
parents:
diff changeset
   147
    const TSize size(KAppIconWidth, KAppIconHeight);
hgs
parents:
diff changeset
   148
    CApaMaskedBitmap* bitmap = CApaMaskedBitmap::NewLC();
hgs
parents:
diff changeset
   149
    User::LeaveIfError( iResources.ApaSession().GetAppIcon(aUid,size,*bitmap) );
hgs
parents:
diff changeset
   150
    User::LeaveIfNull(bitmap->Mask());
hgs
parents:
diff changeset
   151
    TInt iconsCount(0);
hgs
parents:
diff changeset
   152
    iResources.ApaSession().NumberOfOwnDefinedIcons( aUid, iconsCount);
hgs
parents:
diff changeset
   153
    if(0 >= iconsCount)
hgs
parents:
diff changeset
   154
        {
hgs
parents:
diff changeset
   155
        User::Leave(KErrNotFound);
hgs
parents:
diff changeset
   156
        }
hgs
parents:
diff changeset
   157
    
hgs
parents:
diff changeset
   158
    CFbsBitmap *ico(0);
hgs
parents:
diff changeset
   159
    QT_TRYCATCH_LEAVING(
hgs
parents:
diff changeset
   160
        ico = Bitmap(*bitmap, *bitmap->Mask());)
hgs
parents:
diff changeset
   161
    CopyAndDestroyL(aDst, ico);
hgs
parents:
diff changeset
   162
    
hgs
parents:
diff changeset
   163
    CleanupStack::PopAndDestroy(bitmap);
hgs
parents:
diff changeset
   164
    }
hgs
parents:
diff changeset
   165
hgs
parents:
diff changeset
   166
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
   167
void CTsIconProvider::LoadIconFromFileL(CFbsBitmap& aDst, TUid aUid)
hgs
parents:
diff changeset
   168
    {
hgs
parents:
diff changeset
   169
    HBufC* fileName( 0 );
hgs
parents:
diff changeset
   170
    User::LeaveIfError(iResources.ApaSession().GetAppIcon(aUid,fileName));
hgs
parents:
diff changeset
   171
    CleanupStack::PushL(fileName);
hgs
parents:
diff changeset
   172
    fileName->Des().LowerCase();
hgs
parents:
diff changeset
   173
    if(0 == fileName->Right(KImgExtLenght).Compare(KMbmExt))
hgs
parents:
diff changeset
   174
        {
hgs
parents:
diff changeset
   175
        User::LeaveIfError( aDst.Load(*fileName) );
hgs
parents:
diff changeset
   176
        }
hgs
parents:
diff changeset
   177
    else
hgs
parents:
diff changeset
   178
        {
hgs
parents:
diff changeset
   179
        CFbsBitmap* ico(0);
hgs
parents:
diff changeset
   180
        QT_TRYCATCH_LEAVING(
hgs
parents:
diff changeset
   181
            ico = Bitmap(QIcon(XQConversions::s60DescToQString(*fileName)));)
hgs
parents:
diff changeset
   182
        CopyAndDestroyL(aDst, ico);
hgs
parents:
diff changeset
   183
        }
hgs
parents:
diff changeset
   184
        
hgs
parents:
diff changeset
   185
    CleanupStack::PopAndDestroy(fileName);
hgs
parents:
diff changeset
   186
    }
hgs
parents:
diff changeset
   187
hgs
parents:
diff changeset
   188
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
   189
void CTsIconProvider::LoadIconDefaultL(CFbsBitmap& aDst)
hgs
parents:
diff changeset
   190
    {
hgs
parents:
diff changeset
   191
    User::LeaveIfError( aDst.Duplicate( iDefaultIcon->Handle() ) );
hgs
parents:
diff changeset
   192
    }
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
//------------------------------------------------------------------------------
hgs
parents:
diff changeset
   195
void CTsIconProvider::CopyAndDestroyL(CFbsBitmap& aDst, CFbsBitmap* aSrc)
hgs
parents:
diff changeset
   196
    {
hgs
parents:
diff changeset
   197
    User::LeaveIfNull(aSrc);
hgs
parents:
diff changeset
   198
    CleanupStack::PushL(aSrc);
hgs
parents:
diff changeset
   199
    User::LeaveIfError(aDst.Duplicate(aSrc->Handle()));
hgs
parents:
diff changeset
   200
    CleanupStack::PopAndDestroy(aSrc);
hgs
parents:
diff changeset
   201
    }