clfwrapper/ClientSrc/CCLFDbItemContainer.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 18 Jan 2010 20:34:07 +0200
changeset 0 c53acadfccc6
child 40 910a23996aa0
permissions -rw-r--r--
Revision: 201001 Kit: 201003

/*
* Copyright (c) 2002-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: 
*
*/


// INCLUDE FILES
#include    "CCLFDbItemContainer.h"
#include    <mdeobject.h> 
#include    <f32file.h>
#include    "CLFPanics.h"

const TInt KCLFContainerArrayGranularity( 25 );

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

// -----------------------------------------------------------------------------
// CCLFContainerItem::CCLFContainerItem
// -----------------------------------------------------------------------------
//
CCLFContainerItem::CCLFContainerItem( const CMdEObject* aObject )
    : iReferenceCount( 0 ), iMdEObject( aObject ), iDeprecated( EFalse ),
      iItemId( aObject->Id() )
    {
    }

// -----------------------------------------------------------------------------
// CCLFContainerItem::CCLFContainerItem
// -----------------------------------------------------------------------------
//
CCLFContainerItem::CCLFContainerItem()
    : iReferenceCount( 0 ), iMdEObject( NULL ), iDeprecated( EFalse ),
      iItemId( 0 )
	{
	}

// -----------------------------------------------------------------------------
// CCLFContainerItem::NewLC
// -----------------------------------------------------------------------------
//
CCLFContainerItem* CCLFContainerItem::NewLC( const CMdEObject* aObject )
    {
    CCLFContainerItem* self = new ( ELeave ) CCLFContainerItem( aObject );
    CleanupStack::PushL( self );
    return self;
    }

// -----------------------------------------------------------------------------
// CCLFContainerItem::~CCLFContainerItem
// Destructor
// -----------------------------------------------------------------------------
//
CCLFContainerItem::~CCLFContainerItem()
    {
    delete iMdEObject;
    }

// -----------------------------------------------------------------------------
// CCLFContainerItem::Compare
// -----------------------------------------------------------------------------
//
TInt CCLFContainerItem::Compare( const CCLFContainerItem& aFirst,
					             const CCLFContainerItem& aSecond )
	{
	return aFirst.iItemId - aSecond.iItemId;
	}

// -----------------------------------------------------------------------------
// CCLFDbItemContainer::TFindHelper::TFindHelper
// -----------------------------------------------------------------------------
//
CCLFDbItemContainer::TFindHelper::TFindHelper()
    : iItemId( 0 ), 
      iIndex( 0 )
    {
    }

// -----------------------------------------------------------------------------
// CCLFDbItemContainer::TFindHelper::Reset
// -----------------------------------------------------------------------------
//
void CCLFDbItemContainer::TFindHelper::Reset()
    {
    iItemId = 0;
    iIndex = 0;
    }

// -----------------------------------------------------------------------------
// CCLFDbItemContainer::TFindHelper::Set
// -----------------------------------------------------------------------------
//
void CCLFDbItemContainer::TFindHelper::Set( TCLFItemId aItemId, 
                                                   TInt aIndex )
    {
    iItemId = aItemId;
    iIndex = aIndex;
    }

// -----------------------------------------------------------------------------
// CCLFDbItemContainer::CCLFDbItemContainer
// -----------------------------------------------------------------------------
//
CCLFDbItemContainer::CCLFDbItemContainer()
    : iItemArray( KCLFContainerArrayGranularity ),
      iArraySorter( CCLFContainerItem::Compare )
    {
    }

// -----------------------------------------------------------------------------
// CCLFDbItemContainer::NewL
// -----------------------------------------------------------------------------
//
CCLFDbItemContainer* CCLFDbItemContainer::NewL()
    {
    return new( ELeave ) CCLFDbItemContainer;
    }

// -----------------------------------------------------------------------------
// CCLFDbItemContainer::~CCLFDbItemContainer
// Destructor
// -----------------------------------------------------------------------------
//
CCLFDbItemContainer::~CCLFDbItemContainer()
    {
    iItemArray.ResetAndDestroy();
    }

// -----------------------------------------------------------------------------
// CCLFDbItemContainer::ItemById
// -----------------------------------------------------------------------------
//
CCLFContainerItem* CCLFDbItemContainer::ItemById( const TCLFItemId aItemId ) const
    {
    CCLFContainerItem* item = NULL;
    TInt index( FindItem( aItemId, item ) );
    while ( index >= 0 )
        {
		if( !( item->iDeprecated ) )
			{
			return item;
			}
        index = NextItem( item );
        }
    return NULL;
    }

// -----------------------------------------------------------------------------
// CCLFDbItemContainer::ReleaseItem
// -----------------------------------------------------------------------------
//
void CCLFDbItemContainer::ReleaseItem( CCLFContainerItem* aItem )
    {
    const TInt index( iItemArray.Find( aItem ) );
    if ( index >= 0 )
        {
        aItem->iReferenceCount--;
        __ASSERT_DEBUG ( aItem->iReferenceCount >= 0,
                         User::Panic( KCLFPanicText, ECLFNullPointer ) );
        if ( aItem->iReferenceCount <= 0 )
            {
            iItemArray.Remove( index );
            delete aItem;
            aItem = NULL;
            }
        }
    }

// -----------------------------------------------------------------------------
// CCLFDbItemContainer::SetDeprecatedItems
// -----------------------------------------------------------------------------
//
void CCLFDbItemContainer::SetDeprecatedItems(
                                    const RArray<TCLFItemId>& aItemIdArray )
    {
    const TInt count( aItemIdArray.Count() );
    for ( TInt i = 0 ; i < count ; ++i )
        {
        CCLFContainerItem* item = NULL;
        TInt index( FindItem( aItemIdArray[i], item ) );
        while ( index >= 0 )
            {
            item->iDeprecated = ETrue;
            index = NextItem( item );
            }
        }
    }

// -----------------------------------------------------------------------------
// CCLFDbItemContainer::FindItem
// -----------------------------------------------------------------------------
//
TInt CCLFDbItemContainer::FindItem( TCLFItemId aItemId, 
                                    CCLFContainerItem*& aItem ) const
    {
    iFindHelper.Reset();
	iFindItem.SetItemId( aItemId );
    const TInt index ( iItemArray.SpecificFindInOrder( 
                                        &iFindItem, 
                                        iArraySorter, 
                                        EArrayFindMode_First ) );
	if ( index >= 0 )
		{
    	iFindHelper.Set( aItemId, index );
		aItem = iItemArray[index];
		return index;
		}
    return KErrNotFound;
    
    }

// -----------------------------------------------------------------------------
// CCLFDbItemContainer::NextItem
// -----------------------------------------------------------------------------
//
TInt CCLFDbItemContainer::NextItem( CCLFContainerItem*& aItem ) const
    {
    const TInt count( iItemArray.Count() );
    if ( iFindHelper.iIndex < count )
        {
        CCLFContainerItem* item = iItemArray[ iFindHelper.iIndex ];
        if ( iFindHelper.iItemId == item->iItemId )
            {
            iFindHelper.iIndex++;
            aItem = item;
            return iFindHelper.iIndex - 1;
            }
        }
    return KErrNotFound;
    }

//  End of File