⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smbmusicaplibiconcache.cpp

📁 索爱手机代码
💻 CPP
字号:
/* Copyright (C) 2006 Sony Ericsson Mobile Communications Japan, Inc. */
/*--------------------------------------------------------------------*/
// FileName:
//	CSmbMusicAPLibIconCache.h
//
// Description:
//	PTX810 Music傾僾儕 儈儏乕僕僢僋嫟捠儔僀僽儔儕
/*--------------------------------------------------------------------*/
//曄峏棜楌
//擔晅			|曄峏幰			|撪梕
//--------------+---------------+--------------------------------------
//2006/09/23	|SEMC崃绮		|僼傽僀儖僔僗僥儉嫟捠儔僀僽儔儕偐傜愗傝弌偟

#include    "SmbMusicAPLibIconCache.h"     // for self
#include    "TSmbMusicAPLibFunctional.h"    // for TSmbMM_Dereference::Less
#include    "RSmbMusicAPLibSet.h"           // for class RSmbMMSet<Key>
#include    "RSmbMusicAPLibMap.h"           // for class RSmbMMMap<Key, T>

#include    <fbs.h>                 // for class CFbsBitmap
#include    <gulicon.h>             // for class CGulIcon


SEMCJ_NAMESPACE_BEGIN

/**
 *  塀暳偟偨幚憰晹丅
 *
 *  class CSmbMusicAPLibIconCache 偺乽幚憰偺徻嵶乿丅
 */
class CSmbMusicAPLibIconCache::CImpl : public CBase
    {
public:
    /**
     *  僼傽僀儖僷僗柤(僐僺乕抣)偺儐僯乕僋廤崌宆丅
     *
     *  @note   HBufC 偺攋婞(delete)偼 RSmbMMSet 偺 optional 婡擻偵擟偣傞丅
     */
    typedef MUSICAPLIB_NAMESPACE::RSmbMusicAPLibSet< HBufC*, MUSICAPLIB_NAMESPACE::TSmbMusicAPLib_Dereference::Less, MUSICAPLIB_NAMESPACE::TSmbMusicAPLib_Delete >    TPathSet;
    TPathSet    iPathSet;   /**< 僼傽僀儖僷僗柤(僐僺乕抣)偺儐僯乕僋廤崌丅   */

    TPtrC   iFileName;  /**< NewL() or NewLC() 偑庴偗庢偭偨儅儖僠價僢僩儅僢僾僼傽僀儖柤丅   */

    /**
     *  傾僀僐儞僆僽僕僃僋僩偺幆暿僉乕丅
     *
     *  楢憐婰壇偺僉乕偲偟偰巊梡偡傞丅
     */
    struct TKey
        {
        TPtrC   iFileName;  /**< 儘乕僪尦儅儖僠價僢僩儅僢僾僼傽僀儖(*.mbm)偺僼傽僀儖柤丅    */
        TInt    iId4Body;   /**< 杮懱僀儊乕僕偺幆暿巕丅     */
        TInt    iId4Mask;   /**< 儅僗僋僀儊乕僕偺幆暿巕丅   */

        /**
         *  僐儞僗僩儔僋僞丅
         *
         *  @param[in]  aFileName   儘乕僪尦儅儖僠價僢僩儅僢僾僼傽僀儖(*.mbm)偺僼傽僀儖柤丅
         *  @param[in]  aId4Body    杮懱僀儊乕僕偺幆暿巕丅
         *  @param[in]  aId4Mask    儅僗僋僀儊乕僕偺幆暿巕丅
         */
        TKey( const TPtrC& aFileName, TInt aId4Body, TInt aId4Mask )
            : iFileName( aFileName)
            , iId4Body( aId4Body )
            , iId4Mask( aId4Mask )
            {
            // nothing to do.
            }
        /**
         *  斾妑墘嶼巕丅
         *
         *  楢憐婰壇( RSmbMMMap )偺僉乕偨傝摼傞丄偲偄偆栚揑偺傒偱丄掕媊偡傞丅
         *
         *  @param[in]  aRhs    塃曈抣丅
         *  @return *this < aRhs 偲敾抐偟偨応崌偼恀丄偦偆偱側偗傟偽婾丅
         */
        TBool operator<( const TKey& aRhs ) const
            {
            // 桪愭弴埵傪晅偗偰弴偵栤偄丄忋埵梫慺偑摍抣偺偲偒偩偗壓埵梫慺傪斾妑偡傞丅
            // 偱側偄偲丄map 偺 key 偲偟偰偼摦嶌偟側偄丅
            if (iFileName < aRhs.iFileName)
                return ETrue;
            else if (aRhs.iFileName < iFileName)
                return EFalse;

            if (iId4Body < aRhs.iId4Body)
                return ETrue;
            else if (aRhs.iId4Body < iId4Body)
                return EFalse;

            if (iId4Mask < aRhs.iId4Mask)
                return ETrue;
            else if (aRhs.iId4Mask < iId4Mask)
                return EFalse;

            return EFalse;      // 慡梫慺偑摍抣丅
            }
        };  // end of TKey
    /**
     *  傾僀僐儞僉儍僢僔儏偺幚憰宆丅
     *
     *  @note   CGulIcon 偺攋婞(delete)偼 RSmbMMMap 偺 optional 婡擻偵擟偣傞丅
     */
    typedef MUSICAPLIB_NAMESPACE::RSmbMusicAPLibMap< TKey, CGulIcon*, MUSICAPLIB_NAMESPACE::TSmbMusicAPLib_less<TKey>, MUSICAPLIB_NAMESPACE::TSmbMusicAPLib_Delete2nd >   TCache;
    TCache  iCache;     /**< 傾僀僐儞僉儍僢僔儏偺幚懱丅 */

public:
    /**
     *  僐儞僗僩儔僋僞丅
     */
    CImpl()
        : CBase()
        , iPathSet()
        , iFileName()
        , iCache()
        {
        // nothing to do.
        }

    /**
     *  2nd phase 僐儞僗僩儔僋僞丅
     *
     *  @param[in]  aFileName   see CSmbMusicAPLibIconCache::NewL(const TDesC&)
     */
    void ConstructL( const TDesC& aFileName )
        {
        iFileName.Set( UniqPathL(aFileName) );
        }

    /**
     *  僨僗僩儔僋僞丅
     */
    ~CImpl()
        {
        // 仸惗惉偲偼媡弴偵偡傞丄擮偨傔丅
        iCache.Release();   // 慡 CGulIcon 偺 delete 偼 RSmbMMMap 偵擟偣偰偄傞丅
        iPathSet.Release(); // 慡 HBufC* 偺 delete 偼 RSmbMMSet 偵擟偣偰偄傞丅
        }

    /**
     *  巜掕僷僗柤偺儐僯乕僋塱懕僐僺乕傊偺嶲徠傪曉偡丅
     *
     *  @param[in]  aFileName   see CSmbMusicAPLibIconCache::NewL(const TDesC&), CSmbMusicAPFileSystemComIconCache::IconL(TInt, TInt, const TDesC&)
     *  @return 巜掕僷僗柤偺儐僯乕僋塱懕僐僺乕傊偺嶲徠丅
     */
    const TPtrC UniqPathL( const TDesC& aFileName )
        {
        HBufC* path = aFileName.AllocLC();
        MUSICAPLIB_NAMESPACE::TSmbMusicAPLibPair<TPathSet::iterator, TBool> ret = iPathSet.InsertL( path );
        if (ret.iSecond)
            CleanupStack::Pop( path );              // 崱夞憓擖偝傟偨丄強桳尃偼 iPathSet 傊堏揮丅
        else
            CleanupStack::PopAndDestroy( path );    // 婛懚丄崱夞偺僐僺乕偼晄梫丅
        APLIB_FALSE_DEBUG_PANIC_MA ( ret.iFirst != iPathSet.End() );
        APLIB_FALSE_DEBUG_PANIC_MA ( *(*ret.iFirst) == aFileName );
//        __ASSERT_DEBUG( ret.iFirst != iPathSet.End(), User::Panic( MYDLL_UID3, KErrArgument ) );
//        __ASSERT_DEBUG( *(*ret.iFirst) == aFileName, User::Panic( MYDLL_UID3, KErrArgument ) );
        return (*ret.iFirst)->Des();
        }

    };  // end of class CImpl




// ----------------------------------------------------------------------------
//  ctor
// ----------------------------------------------------------------------------
CSmbMusicAPLibIconCache::CSmbMusicAPLibIconCache()
    : CBase()
    , iImpl( NULL )
    {
    // nothing to do.
    }

// ----------------------------------------------------------------------------
//  CSmbMusicAPLibIconCache::ConstructL()
// ----------------------------------------------------------------------------
void CSmbMusicAPLibIconCache::ConstructL( const TDesC& aFileName )
    {
    iImpl = new(ELeave) CImpl();
    iImpl->ConstructL( aFileName );
    }

// ----------------------------------------------------------------------------
//  dtor
// ----------------------------------------------------------------------------
EXPORT_C CSmbMusicAPLibIconCache::~CSmbMusicAPLibIconCache()
    {
    delete iImpl;
    }

// ----------------------------------------------------------------------------
//  CSmbMusicAPLibIconCache::NewL()
// ----------------------------------------------------------------------------
EXPORT_C CSmbMusicAPLibIconCache* CSmbMusicAPLibIconCache::NewL( const TDesC& aFileName/*=KNullDesC*/ )
    {
    CSmbMusicAPLibIconCache* me = NewLC( aFileName );
    CleanupStack::Pop( me );
    return me;
    }

// ----------------------------------------------------------------------------
//  CSmbMusicAPLibIconCache::NewLC()
// ----------------------------------------------------------------------------
EXPORT_C CSmbMusicAPLibIconCache* CSmbMusicAPLibIconCache::NewLC( const TDesC& aFileName/*=KNullDesC*/ )
    {
    CSmbMusicAPLibIconCache* me = new(ELeave) CSmbMusicAPLibIconCache();
    CleanupStack::PushL( me );
    me->ConstructL( aFileName );
    return me;
    }

// ----------------------------------------------------------------------------
//  CSmbMusicAPLibIconCache::IconL()
// ----------------------------------------------------------------------------
EXPORT_C const CGulIcon* CSmbMusicAPLibIconCache::IconL( TInt aId4Body, TInt aId4Mask/*=-1*/, const TDesC& aFileName/*=KNullDesC*/ ) const
    {
    // 傾僀僐儞幆暿僉乕偺慻傒棫偰丅
    const CImpl::TKey key(
        aFileName != KNullDesC ? iImpl->UniqPathL(aFileName) : iImpl->iFileName,    // 堷悢巜掕柍偟(嬻暥帤楍)側傜偽丄ctor偑庴偗庢偭偰偄傞抣傪徣棯帪婛掕抣偲偡傞丅
        aId4Body,
        aId4Mask >= 0 ? aId4Mask : -1   // 堷悢巜掕柍偟(晧悢)側傜偽丄擮偺偨傔 -1 偵娵傔傞丅map忋偱暿key偵側傜側偄傛偆偵偡傞偨傔丅
    );
    APLIB_FALSE_DEBUG_PANIC_MA ( key.iFileName != KNullDesC );  // 偳偪傜偐偱僼傽僀儖柤偑梌偊傜傟偰偄側偗傟偽側傜側偄丅

    if (!iImpl->iCache.Count(key))
        {
        // 枹僉儍僢僔儏丅 惗惉偟丄婰壇偡傞丅
        CGulIcon* icon = LoadImagePairLC( key.iFileName, key.iId4Body, key.iId4Mask );
        iImpl->iCache[ key ] = icon;
        CleanupStack::Pop( icon );
        }

    // key 偺懳墳傾僀僐儞傪曉偡丅
    return iImpl->iCache[ key ];
    }

// ----------------------------------------------------------------------------
//  CSmbMusicAPLibIconCache::Icon()
// ----------------------------------------------------------------------------
EXPORT_C const CGulIcon* CSmbMusicAPLibIconCache::Icon( TInt aId4Body, TInt aId4Mask/*=-1*/, const TDesC& aFileName/*=KNullDesC*/ ) const
    {
    const CGulIcon* ret = NULL;
    TRAPD( leaved, ret = IconL( aId4Body, aId4Mask, aFileName ) );
    return leaved ? NULL : ret;
    }

// ----------------------------------------------------------------------------
//  CSmbMusicAPLibIconCache::IconCloneLC()
// ----------------------------------------------------------------------------
EXPORT_C CGulIcon* CSmbMusicAPLibIconCache::IconCloneLC( TInt aId4Body, TInt aId4Mask/*=-1*/, const TDesC& aFileName/*=KNullDesC*/ ) const
    {
    CGulIcon* ret = IconCloneL( aId4Body, aId4Mask, aFileName );
    if (ret)
        CleanupStack::PushL( ret );
    return ret;
    }

// ----------------------------------------------------------------------------
//  CSmbMusicAPLibIconCache::IconCloneL()
// ----------------------------------------------------------------------------
EXPORT_C CGulIcon* CSmbMusicAPLibIconCache::IconCloneL( TInt aId4Body, TInt aId4Mask/*=-1*/, const TDesC& aFileName/*=KNullDesC*/ ) const
    {
    // 1. 傑偢杮懱 Has-a 側 CGulIcon 傊偺嶲徠傪摼傞丅
    const CGulIcon* icon = IconL( aId4Body, aId4Mask, aFileName );
    if (!icon)
        return NULL;

    // 2. CFbsBitmap 偺 deep copy 傪嶌傞丅
    CFbsBitmap* body = new(ELeave) CFbsBitmap();
    CleanupStack::PushL( body );
    User::LeaveIfError( body->Duplicate(icon->Bitmap()->Handle()) );
    CFbsBitmap* mask = NULL;
    if (icon->Mask())
        {
        mask = new(ELeave) CFbsBitmap();
        CleanupStack::PushL( mask );
        User::LeaveIfError( mask->Duplicate(icon->Mask()->Handle()) );
        }

    // 3. 曉媝梡 deep copy 傪惗惉丅
    CGulIcon* ret = CGulIcon::NewL( body, mask );

    // 4. 屻巒枛丅
    if (mask)
        CleanupStack::Pop( mask );
    CleanupStack::Pop( body );

    return ret;
    }

// ----------------------------------------------------------------------------
//  CSmbMusicAPLibIconCache::IconClone()
// ----------------------------------------------------------------------------
EXPORT_C CGulIcon* CSmbMusicAPLibIconCache::IconClone( TInt aId4Body, TInt aId4Mask/*=-1*/, const TDesC& aFileName/*=KNullDesC*/ ) const
    {
    CGulIcon* ret = NULL;
    TRAPD( leaved, ret = IconCloneL( aId4Body, aId4Mask, aFileName ) );
    return leaved ? NULL : ret;
    }


// ----------------------------------------------------------------------------
//  CSmbMusicAPLibIconCache::LoadImageL()
// ----------------------------------------------------------------------------
EXPORT_C CFbsBitmap* CSmbMusicAPLibIconCache::LoadImageL( const TDesC& aFileName, TInt aId )
    {
    CFbsBitmap* img = LoadImageLC( aFileName, aId );
    CleanupStack::Pop( img );
    return img;
    }

// ----------------------------------------------------------------------------
//  CSmbMusicAPLibIconCache::LoadImageLC()
// ----------------------------------------------------------------------------
EXPORT_C CFbsBitmap* CSmbMusicAPLibIconCache::LoadImageLC( const TDesC& aFileName, TInt aId )
    {
    CFbsBitmap* img = new(ELeave) CFbsBitmap();
    CleanupStack::PushL( img );
    User::LeaveIfError( img->Load(aFileName, aId) );
    return img;
    }

// ----------------------------------------------------------------------------
//  CSmbMusicAPLibIconCache::LoadImagePairL()
// ----------------------------------------------------------------------------
EXPORT_C CGulIcon* CSmbMusicAPLibIconCache::LoadImagePairL( const TDesC& aFileName, TInt aId4Body, TInt aId4Mask/*=-1*/ )
    {
    CGulIcon* img = LoadImagePairLC( aFileName, aId4Body, aId4Mask );
    CleanupStack::Pop( img );
    return img;
    }

// ----------------------------------------------------------------------------
//  CSmbMusicAPLibIconCache::LoadImagePairLC()
// ----------------------------------------------------------------------------
EXPORT_C CGulIcon* CSmbMusicAPLibIconCache::LoadImagePairLC( const TDesC& aFileName, TInt aId4Body, TInt aId4Mask/*=-1*/ )
    {
    CGulIcon* img = CGulIcon::NewLC();
    img->SetBitmap( LoadImageL( aFileName, aId4Body ) );
    if (aId4Mask >= 0)
        img->SetMask( LoadImageL( aFileName, aId4Mask ) );
    return img;
    }

SEMCJ_NAMESPACE_END

/** Copyright (C) 2005-2006 Sony Ericsson Mobile Communications Japan, Inc. */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -