diff -r 000000000000 -r 044383f39525 imgtools/imglib/filesystem/source/cluster.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imgtools/imglib/filesystem/source/cluster.cpp Tue Oct 27 16:36:35 2009 +0000 @@ -0,0 +1,191 @@ +/* +* 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 pointer +CCluster* 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 total +number 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; +}