imgtools/imglib/filesystem/source/cluster.cpp
changeset 0 044383f39525
child 590 360bd6b35136
--- /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;
+}