mtpfws/mtpfw/inc/cmtphandleallocator.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:11:40 +0200
changeset 0 d0791faffa3f
permissions -rw-r--r--
Revision: 201003 Kit: 201005

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

/**
 @file
 @internalTechnology
*/
 
#ifndef CMTPHANDLEALLOCATOR_H
#define CMTPHANDLEALLOCATOR_H

#include <e32base.h>

class CMTPObjectStore;
/** 
Defines the handle allocator which centralize the allocation of object handles

@internalTechnology
 
*/
class CMTPHandleAllocator : public CBase
	{
public:
	static CMTPHandleAllocator* NewL( CMTPObjectStore& aObjectStore );
	~CMTPHandleAllocator();

	TUint32 NextIdL(TUint aDataProviderId);
	void SetIdL( TUint32 aHandleID, TInt64 aPOUID );
	TInt64 NextPOUIDL();
	
   TBool AppendHandleBlockL( TUint aDataProviderId, TUint aNextID, TInt aSpace );
	   
private:
	CMTPHandleAllocator( CMTPObjectStore& aObjectStore );	
	void ConstructL();
    void ExtendArrayL(TUint aDataProviderId);

	TUint32 NextIDFromPoolL( TUint aDataProviderId );
	
    /*
     * Defines the HandleID cache of one data provider. The HandleIDs have been allocated, but now
     * they are available because the corresponding Object have been deleted or ... 
     *  
     * When the HandleID of one data provider is over flow, we have to search the DB to get the available
     * HandleIDs that are not registed in DB.
     * 
     */
    class CDPHandleCache : public CBase
        {
    public:
        
        class THandleBlock
            {
            public:
                THandleBlock( TUint aNextID, TInt aSpace );
            public:
                TUint    iNextID;
                TInt     iSpace;
            };
        
    public:
        static TInt HanldeCacheOrderFromAscending( const CDPHandleCache& aL, const CDPHandleCache& aR);
        static TInt HanldeCacheOrderFromKeyAscending( const TUint* aL, const CDPHandleCache& aR);
        
    public:
        static CDPHandleCache* NewLC( TUint aDataProviderId );
        
        ~CDPHandleCache();
        
        TUint32 NextHandleID();
        void AppendL( const THandleBlock& aBlock );
        
        inline TUint DPID() const
            {
            return iDPID;
            }
        
        inline TBool HasCache() const
            {
            return (iBlocks.Count() != 0);
            }
        
        inline TInt  BlocksCount() const
            {
            return iBlocks.Count();
            }
        
        static inline TInt MaxNumOfBlocks()
            {
            return iNumOfBlocks;
            }
        
    private:
        CDPHandleCache(TUint aDataProviderId);
        void ConstructL();
        
    private:
        /*
         * The number of blocks 
         */
        static const TInt           iNumOfBlocks = 10;
        
        /*
         * Data Provider ID
         */
        TUint                       iDPID;
        
        /*
         * HandleID Blocks
         */
        RArray<THandleBlock>        iBlocks;
        };
    
private:
    CMTPObjectStore&                iObjectStore;
    
	RArray<TUint>					iNextIds;	

	TInt64							iNextPOUID;
	
	//For ObjectID overflow
	RPointerArray<CDPHandleCache>   iNextIDPool;
	};
#endif //CMTPHANDLEALLOCATOR_H