diff -r f6d3d9676ee4 -r d63d727ee0a6 kerneltest/f32test/locl/localeutils/t_tunicodeconv.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/f32test/locl/localeutils/t_tunicodeconv.cpp Mon Jan 04 12:25:19 2010 +0100 @@ -0,0 +1,206 @@ +// Copyright (c) 2007-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 "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include +#include +#include +#include +#include +#include "unicodeconv.h" + +//This function converts from Unicoded characters, to foreign characters and adds them into a descriptor +TInt UnicodeConv::ConvertFromUnicodeL(TDes8& aForeign, const TDesC16& aUnicode, const TDesC8& aReplacementChar, TFatUtilityFunctions::TOverflowAction aOA) + { + const TInt unicodeLength = aUnicode.Length(); + aForeign.Zero(); + + //loop going through the character of the unicode descriptor + for(TInt i=0; i(unicodeChar)); + } + else + { + TInt trailByte = KErrNotFound; + TInt returnValue = TConvDataStruct::ConvertSingleUnicode(unicodeChar,trailByte); + + if(returnValue!=KErrNotFound) + { + if(trailByte!=KErrNotFound) + { + aForeign.Append(static_cast(returnValue)); + + // as two bytes are being added check enough space for second + if ( aForeign.Length() == aForeign.MaxLength() ) + { + if (aOA == TFatUtilityFunctions::EOverflowActionLeave) + { + User::Leave(KErrBadName); + } + else + { + break; + } + } + aForeign.Append(static_cast(trailByte)); + } + else + { + aForeign.Append(static_cast(returnValue)); + } + } + else + { + aForeign.Append(aReplacementChar); + } + } + } + + return KErrNone; + } + + +//This function converts from foreign characters into unicode and adds them into a descriptor +TInt UnicodeConv::ConvertToUnicodeL(TDes16& aUnicode, const TDesC8& aForeign, TFatUtilityFunctions::TOverflowAction aOA) + { + const TInt foreignLength = aForeign.Length(); + aUnicode.Zero(); + + //loop going through the characters of the foreign descriptor + for(TInt i = 0; i(leadForeign)); + else + { + if((i+1)iUnicodeIfSingle) + aUnicode.Append(structPtr->iUnicodeIfSingle); + else + { + if(TConvDataStruct::KMinTrailByte<=tailForeign && tailForeign<=TConvDataStruct::KMaxTrailByte) + aUnicode.Append(TConvDataStruct::KDoubleByteConversions[structPtr->iDoubleByteIndex+ + (tailForeign - TConvDataStruct::KMinTrailByte)]); + else + aUnicode.Append(0xFFFD); + i++; + } + } + } + + return KErrNone; + } + +TBool UnicodeConv::IsLegalShortNameCharacter (TUint aCharacter) + { + //1. aCharacter >= 0x0080 + if (aCharacter>=0x0080) + { + if (aCharacter>0xFFFF) + return EFalse; + + TInt trailByte = KErrNotFound; + TInt returnValue = TConvDataStruct::ConvertSingleUnicode(aCharacter,trailByte); + + if(returnValue!=KErrNotFound) + return ETrue; + else + return EFalse; + } + + // For most common cases: + // Note: lower case characters are considered legal DOS char here. + if ((aCharacter>='a' && aCharacter<='z') || + (aCharacter>='A' && aCharacter<='Z') || + (aCharacter>='0' && aCharacter<='9')) + { + return ETrue; + } + // Checking for illegal chars: + // 2. aCharacter <= 0x20 + // Note: leading 0x05 byte should be guarded by callers of this function + // as the information of the position of the character is required. + if (aCharacter < 0x20) + return EFalse; + // Space (' ') is not considered as a legal DOS char here. + if (aCharacter == 0x20) + return EFalse; + + // 3. 0x20 < aCharacter < 0x80 + // According to FAT Spec, "following characters are not legal in any bytes of DIR_Name": + switch (aCharacter) + { + case 0x22: // '"' + case 0x2A: // '*' + case 0x2B: // '+' + case 0x2C: // ',' + //case 0x2E: // '.' // Although '.' is not allowed in any bytes of DIR_Name, it + // is a valid character in short file names. + case 0x2F: // '/' + case 0x3A: // ':' + case 0x3B: // ';' + case 0x3C: // '<' + case 0x3D: // '=' + case 0x3E: // '>' + case 0x3F: // '?' + case 0x5B: // '[' + case 0x5C: // '\' + case 0x5D: // ']' + case 0x7C: // '|' + return EFalse; + default: + return ETrue; + } + } +