imgtools/imglib/filesystem/source/longname.cpp
changeset 590 360bd6b35136
parent 0 044383f39525
--- a/imgtools/imglib/filesystem/source/longname.cpp	Wed Jun 16 16:51:40 2010 +0300
+++ b/imgtools/imglib/filesystem/source/longname.cpp	Wed Jun 23 16:56:47 2010 +0800
@@ -1,458 +1,462 @@
-/*
-* 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: 
-* Receives the long file name and prepares short and long directory 
-* entries.
-* @internalComponent
-* @released
-*
-*/
-
-
-#include "longname.h"
-
-
-/** 
-Constructor: Responsible to create 
-1. Short entry
-2. Sub components of long entry name as per microsoft FAT spec.
-
-@internalComponent
-@released
-
-@param aClusterPtr - Cluster instance address
-@param aEntry - CDirectory class pointer
-*/
-
-ClongName::ClongName(CCluster* aClusterPtr,
-					 CDirectory* aEntry):
-					 iClusterPtr(aClusterPtr),
-					 iTildeNumberPosition(ETildeNumberPosition),
-					 iSubNameProperEnd(false),
-					 iFirstNullName(false)
-{
-	iLongName = aEntry->GetEntryName();
-	iLongEntryAttribute = aEntry->GetEntryAttribute();
-	iClusterNumber = aClusterPtr->GetCurrentClusterNumber();
-	iLongNameLength = iLongName.length();
-	if(iLongNameLength == 0)
-	{
-		throw ErrorHandler(EMPTYFILENAME, __FILE__, __LINE__);
-	}
-	FormatLongFileName(iLongName);
-	iShortName = GetShortEntryName();
-	GShortEntryList.push_back(iShortName);
-}
-
-
-/**
-Static function to clear the strings stored in static Global Stringlist
-
-@internalComponent
-@released
-*/
-void ClongName::DestroyShortEntryList()
-{
-	GShortEntryList.clear();
-}
-
-/**
-Destructor: To clear the contents from the STL containers in any exception case.
-In normal case the containers are cleared once its usage is finished
-
-@internalComponent
-@released
-*/
-
-ClongName::~ClongName()
-{
-	iSubNamesList.clear();
-	while(iLongEntryStack.size() > 0)
-	{
-		delete iLongEntryStack.top();
-		iLongEntryStack.pop();
-	}
-	/* Cluster instance should be deleted only by dirregion, So just assign 
-	 * NULL value to the pointer
-	 */
-	iClusterPtr = NULL;
-}
-
-/**
-Function takes a long entry and writes all of the attributes into iLongNameEntryString.
-To write the sub name's in a formatted WriteSubName() function invoked
-
-@internalComponent
-@released
-
-@param aLongEntry - the long entry
-*/
-void ClongName::WriteLongEntry(CLongEntry* aLongEntry,String& longEntryString)
-{
-	longEntryString.append(KWriteOnce, aLongEntry->GetDirOrder());
-	WriteSubName(aLongEntry->GetSubName1(),(ESubName1Length*2),longEntryString);
-	longEntryString.append(KWriteOnce, aLongEntry->GetAttribute());
-	longEntryString.append(KWriteOnce, aLongEntry->GetDirType());
-	longEntryString.append(KWriteOnce, aLongEntry->GetCheckSum());
-	WriteSubName(aLongEntry->GetSubName2(),(ESubName2Length*2),longEntryString);
-	unsigned short int lowClusterNumber = aLongEntry->GetClusterNumberLow();
-	longEntryString.append(ToString(lowClusterNumber));
-	WriteSubName(aLongEntry->GetSubName3(),(ESubName3Length*2),longEntryString);
-}
-
-/**
-Function responsible to 
-1. Write the sub name of the long entry, every character splitted by '.'(00)
-2. If the name is not multiple of 13 this function applies NULL character padding and 
-   padding with 'FF'.
-
-@internalComponent
-@released
-
-@param aName - Sub name of a long entry
-@param aSubNameLength - No of characters to be filled
-@param alongEntryString - formatted sub name appended to this string
-*/
-void ClongName::WriteSubName(String& aSubName,unsigned short aSubNameLength,String& alongEntryString)
-{
-	unsigned int subNameCurrLength = aSubName.length();
-	if(subNameCurrLength == 0)
-	{
-		iFirstNullName = true;
-	}
-	else
-	{
-		iFirstNullName = false;
-	}
-	unsigned int beginIndex = 1;
-	if(subNameCurrLength > 0)
-	{
-		//Insert zero between every character, as per FAT spec requirement
-		while(subNameCurrLength > 0)
-		{
-			aSubName.insert(beginIndex,1,0); //Insert zero once
-			beginIndex += 2; //Jump 2 characters
-			--subNameCurrLength;
-		}
-		subNameCurrLength = aSubName.length();
-		if(subNameCurrLength == aSubNameLength)
-		{
-			iSubNameProperEnd = true;
-		}
-		//Apply padding with two zero's to mention Long Name end.
-		if(subNameCurrLength < aSubNameLength)
-		{
-			aSubName.insert(subNameCurrLength, KPaddingCharCnt, 0); 
-		}
-	}
-	subNameCurrLength = aSubName.length();
-	if((iSubNameProperEnd == true) && (iFirstNullName == true))
-	{
-		aSubName.insert(subNameCurrLength, KPaddingCharCnt, 0);
-		iSubNameProperEnd = false;
-		iFirstNullName = false;
-	}
-	subNameCurrLength = aSubName.length();
-	//Insert FF for all unfilled characters.
-	if(subNameCurrLength < aSubNameLength)
-	{
-			aSubName.insert(subNameCurrLength,(aSubNameLength - subNameCurrLength),
-							KLongNamePaddingChar);
-	}
-	alongEntryString.append(aSubName.c_str(),aSubName.length());
-}
-
-/**
-Function responsible to push the string into iNameList container and to erase the input
-strings data
-
-@internalComponent
-@released
-
-@param aFirstName - first sub name
-@param aSecondName - Second sub name
-@param aThirdName - third sub name
-*/
-void ClongName::PushAndErase(String& aFirstName,String& aSecondName,String& aThirdName)
-{
-	iSubNamesList.push_back(aFirstName);
-	aFirstName.erase();
-	iSubNamesList.push_back(aSecondName);
-	aSecondName.erase();
-	iSubNamesList.push_back(aThirdName);
-	aThirdName.erase();
-}
-
-/**
-Function responsible split single sub name from the long name
-
-@internalComponent
-@released
-
-@param aLongName - The long name need to be splitted
-@param aStartIndex - Sub name starting index
-@param aStringLength - total string length
-@param aSubNameLength - Length of the Sub Name of required length
-@param aSubName - splitted Sub Name assigned using this string
-*/
-void ClongName::GetSubName(String& aLongName,
-						   int& aStartIndex,
-						   int& aStringLength,
-						   int aSubNameLength,
-						   String& aSubName)
-{
-	if((aStartIndex + aSubNameLength) <= aStringLength)
-	{
-		aSubName = aLongName.substr(aStartIndex,aSubNameLength);
-		aStartIndex += aSubNameLength;
-		return;
-	}
-	aSubName = aLongName.substr(aStartIndex);
-	aStartIndex += aSubName.length();
-}
-
-/** 
-Function to split the long file name into smaller sub names,such as it should be 
-written into long directory entries. All splitted names are pushed into the 
-iNameList container.
-
-@internalComponent
-@released
-*/
-void ClongName::FormatLongFileName(String& aLongName)
-{
-	int stringLength = aLongName.length();
-	int startIndex = 0;
-	String iSubName1;
-	String iSubName2;
-	String iSubName3;
-
-	while(startIndex < stringLength)
-	{
-		GetSubName(aLongName,startIndex,stringLength,ESubName1Length,iSubName1);
-		GetSubName(aLongName,startIndex,stringLength,ESubName2Length,iSubName2);
-		GetSubName(aLongName,startIndex,stringLength,ESubName3Length,iSubName3);
-		PushAndErase(iSubName1,iSubName2,iSubName3);
-	}
-}
-
-/**
-Function responsible to create new short name if the currently generated short name 
-already exists. 
-
-eg. Input:UNITTE~1TXT returns:UNITTE~2TXT
-
-@internalComponent
-@released
-
-@return - returns the short name
-*/
-void ClongName::CheckAndUpdateShortName(String& aShortName)
-{
-	char trailingChar;
-	StringList::iterator beginIter = GShortEntryList.begin();
-	StringList::iterator endIter = GShortEntryList.end();
-	String tempString;
-	while(beginIter != endIter)
-	{
-		tempString = (*beginIter);
-		if(strcmp(tempString.c_str(),aShortName.c_str()) == 0)
-		{
-			trailingChar = aShortName.at(iTildeNumberPosition);
-			aShortName[iTildeNumberPosition] = ++trailingChar; //Increment the character value by 1
-			continue;
-		}
-		++beginIter;
-	}
-}
-
-/**
-Function responsible to take the long file name as input and to prepare the short name.
-e.g. Long File Name.pl to LONGFI~1PL
-
-@internalComponent
-@released
-
-@return - returns the short name
-*/
-
-String ClongName::GetShortEntryName()
-{
-	String shortName;
-	unsigned int extensionIndex = iLongName.find_last_of(KDot);
-
-	unsigned int dotIndex = extensionIndex;
-	//Erase all the dots from the string, but keep the extension index 
-	while(dotIndex != String::npos)
-	{
-		iLongName.erase(dotIndex,1); //Erase the dot
-		dotIndex = iLongName.find_first_of(KDot);
-		if(dotIndex != String::npos)
-		{
-			//Decrement only if more than one dot exists
-			--extensionIndex;
-		}
-	}
-
-	if((iLongEntryAttribute & EAttrDirectory)== 0) 
-	{
-		if(extensionIndex <= EShortNameInitialLength)
-		{
-			//if the full name length is less than 6 characters, assign the whole name
-			shortName.assign(iLongName.c_str(),extensionIndex);
-		}
-		else
-		{
-			shortName.assign(iLongName.c_str(),EShortNameInitialLength);
-		}
-		//+1 is added to get '~' symbol position
-		iTildeNumberPosition = shortName.length() + 1;
-	}
-	else
-	{
-		shortName.assign(iLongName.c_str(),EShortNameInitialLength);
-	}
-	shortName += KTilde;
-	shortName += KTildeNumber;
-	shortName.assign(ToUpper(shortName));
-	if(extensionIndex <  iLongName.length()) //to identify whether the name has any extension.
-	{
-		if(shortName.length() < ENameLength)
-		{
-			shortName.append((ENameLength - shortName.length()),KSpace);
-		}
-		String shortNameString = iLongName.substr(extensionIndex,EExtensionLength);
-		shortName.append(ToUpper(shortNameString));
-		CheckAndUpdateShortName(shortName);
-		return shortName;
-	}
-	//extension padding
-	shortName.append(EExtensionLength,KSpace);
-	CheckAndUpdateShortName(shortName);
-	return shortName;
-}
-
-/**
-Function takes the short entry name as input and calculates checksum as per the 
-Microsoft FAT spec.
-
-@internalComponent
-@released
-
-@return - returns checkSum
-*/
-
-unsigned char ClongName::CalculateCheckSum()
-{
-	char* tempShortNamePtr = (char*)iShortName.c_str();
-	unsigned short int nameLength = 0;
-	unsigned char chckSum = '\0';
-	for(nameLength = ENameLengthWithExtension; nameLength != 0; nameLength--)
-	{
-		chckSum = ((chckSum & 1) ? 0x80 : NULL) + (chckSum >>1) + *tempShortNamePtr++;
-	}
-	return chckSum;
-}
-
-/**
-Function responsible to initialize short entry attributes.
-Short entry is also an sub entry along with Long entries
-
-@internalComponent
-@released
-
-@param aEntry - directory entry which has long file name
-@return shortEntry - returns the initialized short Directory entry
-*/
-CDirectory* ClongName::CreateShortEntry(CDirectory* aEntry)
-{
-	CDirectory* shortEntry = new CDirectory((char*)iShortName.c_str());
-	shortEntry->SetEntryAttribute(aEntry->GetEntryAttribute()); 
-	if(aEntry->IsFile())
-	{	 
-		shortEntry->SetFilePath((char*)aEntry->GetFilePath().c_str());
-	}
-	shortEntry->SetFileSize(aEntry->GetFileSize());
-	/** Initialize the cluster number variables by splitting high and low words of
-	current cluster number
-	*/
-	shortEntry->SetClusterNumberHi((unsigned short)(iClusterNumber >> KBitShift16));
-	shortEntry->SetClusterNumberLow((unsigned short)(iClusterNumber & KHighWordMask));
-	return shortEntry;
-}
-
-/**
-Function responsible
-1. To erase the string from the iNameList container.
-2. To pop out the element
-
-@internalComponent
-@released
-*/
-void ClongName::PopAndErase()
-{
-	iSubNamesList.front().erase();
-	iSubNamesList.pop_front();
-}
-
-/** 
-Function responsible to 
-1. Pop all the name's 3 by 3 from iNameList container
-2. Construct long name directory entries
-3. Push the long entries into iLongEntryStack 
-4. finally create Long name sub entries as string and append it to longEntryString.
-
-@internalComponent
-@released
-
-@return - returns the formatted long name string
-*/
-String ClongName::CreateLongEntries()
-{
-	String longEntryString;
-	CLongEntry* longEntryObject;
-	unsigned char chckSum = CalculateCheckSum();
-	unsigned char dirOrderNumber = 0x00;
-	while(iSubNamesList.size() > 0)
-	{
-		longEntryObject = new CLongEntry(chckSum);
-		longEntryObject->SetSubName1(iSubNamesList.front());
-		PopAndErase();
-		longEntryObject->SetSubName2(iSubNamesList.front());
-		PopAndErase();
-		longEntryObject->SetSubName3(iSubNamesList.front());
-		PopAndErase();
-		longEntryObject->SetDirOrder(++dirOrderNumber);
-	
-		iLongEntryStack.push(longEntryObject);
-	}
-
-	bool lastLongEntry = true;
-	while(iLongEntryStack.size() > 0)
-	{
-		if(lastLongEntry == true)
-		{
-			longEntryObject = iLongEntryStack.top();
-			/* As per Microsoft FAT spec, Last sub entry of Long name Directory Order attribute
-			 * should be logically OR'ed with value '0x40'
-			 */
-			longEntryObject->SetDirOrder(longEntryObject->GetDirOrder() | ELastLongEntry);
-			lastLongEntry = false;
-		}
-		WriteLongEntry(iLongEntryStack.top(),longEntryString);
-		delete iLongEntryStack.top();
-		iLongEntryStack.pop();
-	}
-	return longEntryString;
-}
+/*
+* 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: 
+* Receives the long file name and prepares short and long directory 
+* entries.
+* @internalComponent
+* @released
+*
+*/
+
+
+#include "longname.h"
+
+
+/** 
+Constructor: Responsible to create 
+1. Short entry
+2. Sub components of long entry name as per microsoft FAT spec.
+
+@internalComponent
+@released
+
+@param aClusterPtr - Cluster instance address
+@param aEntry - CDirectory class pointer
+*/
+
+ClongName::ClongName(CCluster* aClusterPtr,
+					 CDirectory* aEntry):
+					 iClusterPtr(aClusterPtr),
+					 iTildeNumberPosition(ETildeNumberPosition),
+					 iSubNameProperEnd(false),
+					 iFirstNullName(false)
+{
+	iLongName = aEntry->GetEntryName();
+	iLongEntryAttribute = aEntry->GetEntryAttribute();
+	iClusterNumber = aClusterPtr->GetCurrentClusterNumber();
+	iLongNameLength = iLongName.length();
+	if(iLongNameLength == 0)
+	{
+		throw ErrorHandler(EMPTYFILENAME, __FILE__, __LINE__);
+	}
+	FormatLongFileName(iLongName);
+	iShortName = GetShortEntryName();
+	GShortEntryList.push_back(iShortName);
+}
+
+
+/**
+Static function to clear the strings stored in static Global Stringlist
+
+@internalComponent
+@released
+*/
+void ClongName::DestroyShortEntryList()
+{
+	GShortEntryList.clear();
+}
+
+/**
+Destructor: To clear the contents from the STL containers in any exception case.
+In normal case the containers are cleared once its usage is finished
+
+@internalComponent
+@released
+*/
+
+ClongName::~ClongName()
+{
+	iSubNamesList.clear();
+	while(iLongEntryStack.size() > 0)
+	{
+		delete iLongEntryStack.top();
+		iLongEntryStack.pop();
+	}
+	/* Cluster instance should be deleted only by dirregion, So just assign 
+	 * NULL value to the pointer
+	 */
+	iClusterPtr = NULL;
+}
+
+/**
+Function takes a long entry and writes all of the attributes into iLongNameEntryString.
+To write the sub name's in a formatted WriteSubName() function invoked
+
+@internalComponent
+@released
+
+@param aLongEntry - the long entry
+*/
+void ClongName::WriteLongEntry(CLongEntry* aLongEntry,string& longEntryString)
+{
+	longEntryString.append(KWriteOnce, aLongEntry->GetDirOrder());
+	WriteSubName(aLongEntry->GetSubName1(),(ESubName1Length*2),longEntryString);
+	longEntryString.append(KWriteOnce, aLongEntry->GetAttribute());
+	longEntryString.append(KWriteOnce, aLongEntry->GetDirType());
+	longEntryString.append(KWriteOnce, aLongEntry->GetCheckSum());
+	WriteSubName(aLongEntry->GetSubName2(),(ESubName2Length*2),longEntryString);
+	unsigned short int lowClusterNumber = aLongEntry->GetClusterNumberLow();
+	longEntryString.append(ToString(lowClusterNumber));
+	WriteSubName(aLongEntry->GetSubName3(),(ESubName3Length*2),longEntryString);
+}
+
+/**
+Function responsible to 
+1. Write the sub name of the long entry, every character splitted by '.'(00)
+2. If the name is not multiple of 13 this function applies NULL character padding and 
+   padding with 'FF'.
+
+@internalComponent
+@released
+
+@param aName - Sub name of a long entry
+@param aSubNameLength - No of characters to be filled
+@param alongEntryString - formatted sub name appended to this string
+*/
+void ClongName::WriteSubName(string& aSubName,unsigned short aSubNameLength,string& alongEntryString)
+{
+	unsigned int subNameCurrLength = aSubName.length();
+	if(subNameCurrLength == 0)
+	{
+		iFirstNullName = true;
+	}
+	else
+	{
+		iFirstNullName = false;
+	}
+	unsigned int beginIndex = 1;
+	if(subNameCurrLength > 0)
+	{
+		//Insert zero between every character, as per FAT spec requirement
+		while(subNameCurrLength > 0)
+		{
+			aSubName.insert(beginIndex,1,0); //Insert zero once
+			beginIndex += 2; //Jump 2 characters
+			--subNameCurrLength;
+		}
+		subNameCurrLength = aSubName.length();
+		if(subNameCurrLength == aSubNameLength)
+		{
+			iSubNameProperEnd = true;
+		}
+		//Apply padding with two zero's to mention Long Name end.
+		if(subNameCurrLength < aSubNameLength)
+		{
+			aSubName.insert(subNameCurrLength, KPaddingCharCnt, 0); 
+			iSubNameProperEnd = false;
+		}
+	}
+	subNameCurrLength = aSubName.length();
+	if((iSubNameProperEnd == true) && (iFirstNullName == true))
+	{
+		aSubName.insert(subNameCurrLength, KPaddingCharCnt, 0);
+		iSubNameProperEnd = false;
+		iFirstNullName = false;
+	}
+	subNameCurrLength = aSubName.length();
+	//Insert FF for all unfilled characters.
+	if(subNameCurrLength < aSubNameLength)
+	{
+			aSubName.insert(subNameCurrLength,(aSubNameLength - subNameCurrLength),
+							KLongNamePaddingChar);
+	}
+	alongEntryString.append(aSubName.c_str(),aSubName.length());
+}
+
+/**
+Function responsible to push the string into iNameList container and to erase the input
+strings data
+
+@internalComponent
+@released
+
+@param aFirstName - first sub name
+@param aSecondName - Second sub name
+@param aThirdName - third sub name
+*/
+void ClongName::PushAndErase(string& aFirstName,string& aSecondName,string& aThirdName)
+{
+	iSubNamesList.push_back(aFirstName);
+	aFirstName.erase();
+	iSubNamesList.push_back(aSecondName);
+	aSecondName.erase();
+	iSubNamesList.push_back(aThirdName);
+	aThirdName.erase();
+}
+
+/**
+Function responsible split single sub name from the long name
+
+@internalComponent
+@released
+
+@param aLongName - The long name need to be splitted
+@param aStartIndex - Sub name starting index
+@param aStringLength - total string length
+@param aSubNameLength - Length of the Sub Name of required length
+@param aSubName - splitted Sub Name assigned using this string
+*/
+void ClongName::GetSubName(string& aLongName,
+						   int& aStartIndex,
+						   int& aStringLength,
+						   int aSubNameLength,
+						   string& aSubName)
+{
+	if((aStartIndex + aSubNameLength) <= aStringLength)
+	{
+		aSubName = aLongName.substr(aStartIndex,aSubNameLength);
+		aStartIndex += aSubNameLength;
+		return;
+	}
+	aSubName = aLongName.substr(aStartIndex);
+	aStartIndex += aSubName.length();
+}
+
+/** 
+Function to split the long file name into smaller sub names,such as it should be 
+written into long directory entries. All splitted names are pushed into the 
+iNameList container.
+
+@internalComponent
+@released
+*/
+void ClongName::FormatLongFileName(string& aLongName)
+{
+	int stringLength = aLongName.length();
+	int startIndex = 0;
+	string iSubName1;
+	string iSubName2;
+	string iSubName3;
+
+	while(startIndex < stringLength)
+	{
+		GetSubName(aLongName,startIndex,stringLength,ESubName1Length,iSubName1);
+		GetSubName(aLongName,startIndex,stringLength,ESubName2Length,iSubName2);
+		GetSubName(aLongName,startIndex,stringLength,ESubName3Length,iSubName3);
+		PushAndErase(iSubName1,iSubName2,iSubName3);
+	}
+}
+
+/**
+Function responsible to create new short name if the currently generated short name 
+already exists. 
+
+eg. Input:UNITTE~1TXT returns:UNITTE~2TXT
+
+@internalComponent
+@released
+
+@return - returns the short name
+*/
+void ClongName::CheckAndUpdateShortName(string& aShortName)
+{
+	char trailingChar;
+	StringList::iterator beginIter = GShortEntryList.begin();
+	StringList::iterator endIter = GShortEntryList.end();
+	string tempString;
+	while(beginIter != endIter)
+	{
+		tempString = (*beginIter);
+		if(strcmp(tempString.c_str(),aShortName.c_str()) == 0)
+		{
+			trailingChar = aShortName.at(iTildeNumberPosition);
+			aShortName[iTildeNumberPosition] = ++trailingChar; //Increment the character value by 1
+			continue;
+		}
+		++beginIter;
+	}
+        int gap = ENameLengthWithExtension - aShortName.length();
+        if(gap >0 )
+            aShortName.append(gap,KSpace);
+}
+
+/**
+Function responsible to take the long file name as input and to prepare the short name.
+e.g. Long File Name.pl to LONGFI~1PL
+
+@internalComponent
+@released
+
+@return - returns the short name
+*/
+
+string ClongName::GetShortEntryName()
+{
+	string shortName;
+	unsigned int extensionIndex = iLongName.find_last_of(KDot);
+
+	unsigned int dotIndex = extensionIndex;
+	//Erase all the dots from the string, but keep the extension index 
+	while(dotIndex != string::npos)
+	{
+		iLongName.erase(dotIndex,1); //Erase the dot
+		dotIndex = iLongName.find_first_of(KDot);
+		if(dotIndex != string::npos)
+		{
+			//Decrement only if more than one dot exists
+			--extensionIndex;
+		}
+	}
+
+	if((iLongEntryAttribute & EAttrDirectory)== 0) 
+	{
+		if(extensionIndex <= EShortNameInitialLength)
+		{
+			//if the full name length is less than 6 characters, assign the whole name
+			shortName.assign(iLongName.c_str(),extensionIndex);
+		}
+		else
+		{
+			shortName.assign(iLongName.c_str(),EShortNameInitialLength);
+		}
+		//+1 is added to get '~' symbol position
+		iTildeNumberPosition = shortName.length() + 1;
+	}
+	else
+	{
+		shortName.assign(iLongName.c_str(),EShortNameInitialLength);
+	}
+	shortName += KTilde;
+	shortName += KTildeNumber;
+	shortName.assign(ToUpper(shortName));
+	if(extensionIndex <  iLongName.length()) //to identify whether the name has any extension.
+	{
+		if(shortName.length() < ENameLength)
+		{
+			shortName.append((ENameLength - shortName.length()),KSpace);
+		}
+		string shortNameString = iLongName.substr(extensionIndex,EExtensionLength);
+		shortName.append(ToUpper(shortNameString));
+		CheckAndUpdateShortName(shortName);
+		return shortName;
+	}
+	//extension padding
+	shortName.append(EExtensionLength,KSpace);
+	CheckAndUpdateShortName(shortName);
+	return shortName;
+}
+
+/**
+Function takes the short entry name as input and calculates checksum as per the 
+Microsoft FAT spec.
+
+@internalComponent
+@released
+
+@return - returns checkSum
+*/
+
+unsigned char ClongName::CalculateCheckSum()
+{
+	char* tempShortNamePtr = (char*)iShortName.c_str();
+	unsigned short int nameLength = 0;
+	unsigned char chckSum = '\0';
+	for(nameLength = ENameLengthWithExtension; nameLength != 0; nameLength--)
+	{
+		chckSum = ((chckSum & 1) ? 0x80 : NULL) + (chckSum >>1) + *tempShortNamePtr++;
+	}
+	return chckSum;
+}
+
+/**
+Function responsible to initialize short entry attributes.
+Short entry is also an sub entry along with Long entries
+
+@internalComponent
+@released
+
+@param aEntry - directory entry which has long file name
+@return shortEntry - returns the initialized short Directory entry
+*/
+CDirectory* ClongName::CreateShortEntry(CDirectory* aEntry)
+{
+	CDirectory* shortEntry = new CDirectory(iShortName.c_str(),NULL);
+	shortEntry->SetEntryAttribute(aEntry->GetEntryAttribute()); 
+	if(aEntry->IsFile())
+	{	 
+		shortEntry->SetFilePath((char*)aEntry->GetFilePath().c_str());
+	}
+	shortEntry->SetFileSize(aEntry->GetFileSize());
+	/** Initialize the cluster number variables by splitting high and low words of
+	current cluster number
+	*/
+	shortEntry->SetClusterNumberHi((unsigned short)(iClusterNumber >> KBitShift16));
+	shortEntry->SetClusterNumberLow((unsigned short)(iClusterNumber & KHighWordMask));
+	return shortEntry;
+}
+
+/**
+Function responsible
+1. To erase the string from the iNameList container.
+2. To pop out the element
+
+@internalComponent
+@released
+*/
+void ClongName::PopAndErase()
+{
+	iSubNamesList.front().erase();
+	iSubNamesList.pop_front();
+}
+
+/** 
+Function responsible to 
+1. Pop all the name's 3 by 3 from iNameList container
+2. Construct long name directory entries
+3. Push the long entries into iLongEntryStack 
+4. finally create Long name sub entries as string and append it to longEntryString.
+
+@internalComponent
+@released
+
+@return - returns the formatted long name string
+*/
+string ClongName::CreateLongEntries()
+{
+	string longEntryString;
+	CLongEntry* longEntryObject;
+	unsigned char chckSum = CalculateCheckSum();
+	unsigned char dirOrderNumber = 0x00;
+	while(iSubNamesList.size() > 0)
+	{
+		longEntryObject = new CLongEntry(chckSum);
+		longEntryObject->SetSubName1(iSubNamesList.front());
+		PopAndErase();
+		longEntryObject->SetSubName2(iSubNamesList.front());
+		PopAndErase();
+		longEntryObject->SetSubName3(iSubNamesList.front());
+		PopAndErase();
+		longEntryObject->SetDirOrder(++dirOrderNumber);
+	
+		iLongEntryStack.push(longEntryObject);
+	}
+
+	bool lastLongEntry = true;
+	while(iLongEntryStack.size() > 0)
+	{
+		if(lastLongEntry == true)
+		{
+			longEntryObject = iLongEntryStack.top();
+			/* As per Microsoft FAT spec, Last sub entry of Long name Directory Order attribute
+			 * should be logically OR'ed with value '0x40'
+			 */
+			longEntryObject->SetDirOrder(longEntryObject->GetDirOrder() | ELastLongEntry);
+			lastLongEntry = false;
+		}
+		WriteLongEntry(iLongEntryStack.top(),longEntryString);
+		delete iLongEntryStack.top();
+		iLongEntryStack.pop();
+	}
+	return longEntryString;
+}