diff -r c7c26511138f -r 360bd6b35136 imgtools/imglib/filesystem/source/longname.cpp --- 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; +}