/** 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 the License "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: * Cluster class used to allocate cluster numbers for directory entries * and while writing file contents. And it is responsible to create the * MAP of content starting cluster to ending cluster which can be used * to generate FAT table. Since the cluster number is unique all over the* filesystem component, this class is designed as singleton class.* @internalComponent* @released**/#include "cluster.h"//Initialize the Static CCluster instance pointerCCluster* CCluster::iClusterInstance = NULL;/**Static function which is used to instantiate and return the address of CCluster class.@internalComponent@released@param aClusterSize - single cluster size in Bytes@param aTotalNumberOfClusters - Maximum number of clusters@return - returns the instance of CCluster class*/CCluster* CCluster::Instance(unsigned int aClusterSize,unsigned int aTotalNumberOfClusters) { if (iClusterInstance == NULL) // is it the first call? { // create sole instance iClusterInstance = new CCluster(aClusterSize, aTotalNumberOfClusters); } return iClusterInstance; // address of sole instance}/**Destructor: Clears the clusters per entry map@internalComponent@released*/CCluster::~CCluster (){ iClustersPerEntry.clear(); iClusterInstance = NULL;}/**Constructor Receives inputs from dirregion Class and initializes the class variables@internalComponent@released@param aClusterSize - Size of every Cluster@param aTotalNumberOfClusters - maximum number of clusters allowed for current FAT image*/CCluster::CCluster(unsigned int aClusterSize, unsigned int aTotalNumberOfClusters) :iClusterSize(aClusterSize),iTotalNumberOfClusters(aTotalNumberOfClusters){ iRootClusterNumber = KRootClusterNumber; iCurrentClusterNumber = iRootClusterNumber;}/**Function to return the current cluster number@internalComponent@released@return - returns the current cluster number*/unsigned int CCluster::GetCurrentClusterNumber() const{ return iCurrentClusterNumber;}/** Function to decrement the current cluster number@internalComponent@released*/void CCluster::DecrementCurrentClusterNumber(){ --iCurrentClusterNumber;}/**Function to get the High word of Current cluster number@internalComponent@released@return - returns the 16 bit HIGH word*/unsigned short int CCluster::GetHighWordClusterNumber() const{ return (unsigned short)(iCurrentClusterNumber >> KBitShift16);}/**Function to get the Low word of Current cluster number@internalComponent@released@return - returns the 16 bit LOW word*/unsigned short int CCluster::GetLowWordClusterNumber() const{ return (unsigned short)(iCurrentClusterNumber & KHighWordMask);}/**Function responsible to 1. Increment the current Cluster Number 2. Throw the error "image size too big" if the allocated clusters count exceeds totalnumber of available clusters.@internalComponent@released*/void CCluster::UpdateNextAvailableClusterNumber(){ if(iCurrentClusterNumber >= iTotalNumberOfClusters) { throw ErrorHandler(IMAGESIZETOOBIG,"Occupied number of clusters count exceeded than available clusters",__FILE__,__LINE__); } ++iCurrentClusterNumber;}/**Function to Return the cluster size@internalComponent@released@return the cluster size*/unsigned int CCluster::GetClusterSize() const{ return iClusterSize;}/**Function Creates mapping between starting cluster number (where data starts) and the sub sequent cluster numbers (where the data extends).@internalComponent@released@param aStartingClusterNumber - Cluster number where the data starts@param aPairClusterNumber - Cluster number where the data extends*/void CCluster::CreateMap(unsigned int aStartingClusterNumber,unsigned int aPairClusterNumber){ iClustersPerEntry.insert(std::make_pair(aStartingClusterNumber,aPairClusterNumber));}/**Function to get Clusters per Entry MAP container.@internalComponent@released@return - returns the CLusters per entry container*/TClustersPerEntryMap* CCluster::GetClustersPerEntryMap(){ return &iClustersPerEntry;}