--- /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;
+}