Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h)
Have multiple extension sections in the bld.inf, one for each version
of the compiler. The RVCT version building the tools will build the
runtime libraries for its version, but make sure we extract all the other
versions from zip archives. Also add the archive for RVCT4.
/*
* Copyright (c) 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:
*
*/
#define __E32TEST_EXTENSION__
#include "T_Fatcharsetconv_aux.h"
#include <f32file.h>
#include <e32test.h>
#include <e32svr.h>
#include <HAL.H>
#include <f32fsys.h>
#include <f32dbg.h>
#include "..\server\t_server.h"
//#include "fat_utils.h"
extern RFile TheFile;
#if defined(_DEBUG) || defined(_DEBUG_RELEASE)
void TestIllegalCharsWithDll()
{
test.Next(_L("Test Illegal Character handling with DLL"));
__UHEAP_MARK;
// logging for failure
gTCType = ESymbianFATSpecific;
RBuf failedOnBuf;
failedOnBuf.CreateL(gLogFailureData.iFuncName);
gTCId = 0;
RBuf tcUniquePath;
tcUniquePath.CreateL(KNone());
QuickFormat();
CreateTestDirectory(_L("\\F32-TST\\T_FATCHARSETCONV\\"));
TInt r = TheFs.ControlIo(CurrentDrive(), KControlIoEnableFatUtilityFunctions);
testAndLog(r==KErrNone);
r = UserSvr::ChangeLocale(KTestLocale);
testAndLog(r==KErrNone);
_LIT(KTestNormalUnicodeFileName, "\x65B0\x6587\x4EF6.TXT");
_LIT(KTestNormalUnicodeFileNameShortDefualt, "\x65B0\x6587\x4EF6.TXT");
_LIT(KTestFileNameWithIllegalChars, "\x222F\x2F3A\x3C3E\x7C00.TXT");
_LIT(KFileNameWithIllegalCharsShort, "___\x7C00.TXT");
_LIT(KTestFileNameWithWildChars, "\x235B\x245C\x255D\x265E.TXT");
_LIT(KTestFileNameWithWildCharsShort, "____.TXT");
TFileName shn;
MakeFile(KTestNormalUnicodeFileName);
r = TheFs.GetShortName(KTestNormalUnicodeFileName, shn);
testAndLog(r==KErrNone);
r = shn.Compare(KTestNormalUnicodeFileNameShortDefualt);
testAndLog(r==0);
TFileName lgn;
r = TheFs.GetLongName(KTestNormalUnicodeFileNameShortDefualt, lgn);
testAndLog(r==KErrNone);
r = lgn.Compare(KTestNormalUnicodeFileName);
testAndLog(r==0);
// Test illegal 8-bit ASCII chars in 16-bit Unicode chars.
MakeFile(KTestFileNameWithIllegalChars);
r = TheFs.GetShortName(KTestFileNameWithIllegalChars, shn);
testAndLog(r==KErrNone);
r = shn.Compare(KFileNameWithIllegalCharsShort);
testAndLog(r==0);
// Test wildcards, 8-bit ASCII chars in 16-bit Unicode chars.
MakeFile(KTestFileNameWithWildChars);
r = TheFs.GetShortName(KTestFileNameWithWildChars, shn);
test_KErrNone(r);
r = shn.Compare(KTestFileNameWithWildCharsShort);
testAndLog(r==0);
r=TheFs.Delete(KTestFileNameWithIllegalChars);
testAndLog(r==0);
r=TheFs.Delete(KTestNormalUnicodeFileName);
testAndLog(r==0);
r=TheFs.Delete(KTestFileNameWithWildChars);
testAndLog(r==0);
r = TheFs.ControlIo(CurrentDrive(), KControlIoDisableFatUtilityFunctions);
testAndLog(r==KErrNone);
failedOnBuf.Close();
tcUniquePath.Close();
__UHEAP_MARKEND;
}
void TestIllegalCharsWithoutDLL()
{
test.Next(_L("Test Illegal Character handling without DLL"));
__UHEAP_MARK;
// logging for failure
gTCType = ESymbianFATSpecific;
RBuf failedOnBuf;
failedOnBuf.CreateL(gLogFailureData.iFuncName);
gTCId = 0;
RBuf tcUniquePath;
tcUniquePath.CreateL(KNone());
QuickFormat();
CreateTestDirectory(_L("\\F32-TST\\T_FATCHARSETCONV\\"));
TInt r = TheFs.ControlIo(CurrentDrive(), KControlIoDisableFatUtilityFunctions);
testAndLog(r==KErrNone);
_LIT(KTestNormalUnicodeFileName, "\x65B0\x6587\x4EF6.TXT");
_LIT(KTestNormalUnicodeFileNameShortDefualt, "___.TXT");
_LIT(KTestFileNameWithIllegalChars, "\x222F\x2F3A\x3C3E\x7C00.TXT");
_LIT(KFileNameWithIllegalCharsShort, "____.TXT");
_LIT(KTestFileNameWithWildChars, "\x235B\x245C\x255D\x265E.TXT");
_LIT(KTestFileNameWithWildCharsShort, "____~1.TXT");
TFileName shn;
MakeFile(KTestNormalUnicodeFileName);
r = TheFs.GetShortName(KTestNormalUnicodeFileName, shn);
testAndLog(r==KErrNone);
r = shn.Compare(KTestNormalUnicodeFileNameShortDefualt);
testAndLog(r==0);
TFileName lgn;
r = TheFs.GetLongName(KTestNormalUnicodeFileNameShortDefualt, lgn);
testAndLog(r==KErrNone);
r = lgn.Compare(KTestNormalUnicodeFileName);
testAndLog(r==0);
// Test illegal 8-bit ASCII chars in 16-bit Unicode chars.
MakeFile(KTestFileNameWithIllegalChars);
r = TheFs.GetShortName(KTestFileNameWithIllegalChars, shn);
testAndLog(r==KErrNone);
r = shn.Compare(KFileNameWithIllegalCharsShort);
testAndLog(r==0);
// Test illegal 8-bit ASCII chars in 16-bit Unicode chars.
MakeFile(KTestFileNameWithWildChars);
r = TheFs.GetShortName(KTestFileNameWithWildChars, shn);
testAndLog(r==KErrNone);
r = shn.Compare(KTestFileNameWithWildCharsShort);
testAndLog(r==0);
r=TheFs.Delete(KTestFileNameWithIllegalChars);
testAndLog(r==0);
r=TheFs.Delete(KTestNormalUnicodeFileName);
testAndLog(r==0);
r=TheFs.Delete(KTestFileNameWithWildChars);
testAndLog(r==0);
failedOnBuf.Close();
tcUniquePath.Close();
__UHEAP_MARKEND;
}
void TestFileLengthMax()
{
test.Next(_L("Test accesing a long file with filename length <250 characters"));
__UHEAP_MARK;
// logging for failure
gTCType = ESymbianFATSpecific;
RBuf failedOnBuf;
failedOnBuf.CreateL(gLogFailureData.iFuncName);
gTCId = 0;
RBuf tcUniquePath;
tcUniquePath.CreateL(KNone());
QuickFormat();
CreateTestDirectory(_L("\\F32-TST\\T_FATCHARSETCONV\\"));
TBuf<KMaxFileName> longName;
_LIT(KTestDir1, "\\TEST\\TESTLONGFILENAMELENGTH\\TESTMORETHAN250CHARACTERS\\") ;
_LIT(KTestDir2, "\x65B0\x6587\x4EF6\x4EF6(ABCDEFGH)\\(\x65B0\x6587\x4EF6\x4EF6)PQRST\\");
_LIT(KTestDir3, "MULTILEVEL-FOLDER1\\MULTILEVEL-FOLDER2\\MULTILEVEL-FOLDER3\\");
_LIT(KTestDir4, "\x65B0\x65B0\x65B0\x65B0(x6587)\\(\x6587\x6587\x6587\x6587)PQRST\\");
_LIT(KTestDir5, "\x4EF6\x4EF6\x4EF6\x4EF6(x4EF6)\\(\x6587\x6587\x6587\x6587)XYZ\\");
_LIT(KTestDir6, "TESTINGINPROGRESS\\");
_LIT(KTestLongFileLength, "\x4EF6\x4EF6\x4EF6\x4EF6(x4EF6).TXT");
longName += KTestDir1;
longName += KTestDir2;
longName += KTestDir3;
longName += KTestDir4;
longName += KTestDir5;
longName += KTestDir6;
test.Printf(_L("longName count is %d "), longName.Length());
TInt r=TheFs.MkDirAll(longName);
longName += KTestLongFileLength;
test.Printf(_L("longName count is %d "), longName.Length());
testAndLog(longName.Length()<256);
r=TheFile.Create(TheFs,longName ,EFileWrite);
testAndLog(r==KErrNone);
TheFile.Close();
r=TheFile.Open(TheFs,longName ,EFileWrite);
testAndLog(r==KErrNone);
TheFile.Close();
TheFs.Delete(longName);
failedOnBuf.Close();
tcUniquePath.Close();
__UHEAP_MARKEND;
}
void TestFileLengthExceedMax()
{
test.Next(_L("Test accesing a long file with filename length >250 characters"));
__UHEAP_MARK;
// logging for failure
gTCType = ESymbianFATSpecific;
RBuf failedOnBuf;
failedOnBuf.CreateL(gLogFailureData.iFuncName);
gTCId = 0;
RBuf tcUniquePath;
tcUniquePath.CreateL(KNone());
QuickFormat();
CreateTestDirectory(_L("\\F32-TST\\T_FATCHARSETCONV\\"));
TInt r = TheFs.SessionPath(gSessionPath);
testAndLog(r==KErrNone);
TBuf<350> longName;
_LIT(KTestDir1, "\\TEST\\TESTLONGFILENAMELENGTH\\TESTMORETHAN260CHARACTERS\\") ;
_LIT(KTestDir2, "\x65B0\x6587\x4EF6\x4EF6(ABCDEFGH)\\(\x65B0\x6587\x4EF6\x4EF6)PQRST\\");
_LIT(KTestDir3, "MULTILEVEL-FOLDER1\\MULTILEVEL-FOLDER2\\MULTILEVEL-FOLDER3\\");
_LIT(KTestDir4, "\x65B0\x65B0\x65B0\x65B0(x6587)\\(\x6587\x6587\x6587\x6587)PQRST\\");
_LIT(KTestDir5, "\x4EF6\x4EF6\x4EF6\x4EF6(x4EF6)\\(\x6587\x6587\x6587\x6587)XYZ\\");
_LIT(KTestDir6, "TESTINGINPROGRESS(TESTLENGTH)>256\\");
_LIT(KTestLongFileLength, "\x4EF6\x4EF6\x4EF6\x4EF6(x4EF6).TXT");
longName = gSessionPath;
longName += KTestDir1;
longName += KTestDir2;
longName += KTestDir3;
longName += KTestDir4;
longName += KTestDir5;
longName += KTestDir6;
test.Printf(_L("longName length is %d "), longName.Length());
r=TheFs.MkDirAll(longName);
longName += KTestLongFileLength;
test.Printf(_L("longName count is %d "), longName.Length());
testAndLog(longName.Length()>256);
r=TheFile.Create(TheFs,longName ,EFileWrite);
testAndLog(r==KErrBadName);
// TheFile.Close();
r=TheFile.Open(TheFs,longName ,EFileWrite);
testAndLog(r==KErrBadName);
// TheFile.Close();
TheFs.Delete(longName);
failedOnBuf.Close();
tcUniquePath.Close();
__UHEAP_MARKEND;
}
void TestLeadingE5Handling()
{
test.Next(_L("Test Leading \'E5\' byte handling"));
__UHEAP_MARK;
// logging for failure
gTCType = ESymbianFATSpecific;
RBuf failedOnBuf;
failedOnBuf.CreateL(gLogFailureData.iFuncName);
gTCId = 0;
RBuf tcUniquePath;
tcUniquePath.CreateL(KNone());
QuickFormat();
CreateTestDirectory(_L("\\F32-TST\\T_FATCHARSETCONV\\"));
// Enables codepage dll implementation of LocaleUtils functions for this test only
TInt r = TheFs.ControlIo(CurrentDrive(), KControlIoEnableFatUtilityFunctions);
testAndLog(r==KErrNone);
r = UserSvr::ChangeLocale(KTestLocale);
testAndLog(r==KErrNone);
r=TheFs.SessionPath(gSessionPath);
testAndLog(r==KErrNone);
_LIT(KTestFilePathAndName, "\\F32-TST\\T_FATCHARSETCONV\\\x88F9.TXT");
_LIT(KTestFileShortName, "\x88F9.TXT");
MakeFile(KTestFilePathAndName);
TFileName sn;
r = TheFs.GetShortName(KTestFilePathAndName, sn);
testAndLog(r==KErrNone);
r = sn.Compare(KTestFileShortName);
testAndLog(r==KErrNone);
r=TheFs.Delete(KTestFilePathAndName);
testAndLog(r==KErrNone);
// Disables codepage dll implementation of LocaleUtils functions for other base tests
r = TheFs.ControlIo(CurrentDrive(), KControlIoDisableFatUtilityFunctions);
testAndLog(r==KErrNone);
failedOnBuf.Close();
tcUniquePath.Close();
__UHEAP_MARKEND;
}
void TestVFATCase3()
{
test.Next(_L("Test With VFAT entry, and DOS entry using Non-CP932 Japanese file's access"));
__UHEAP_MARK;
// logging for failure
gTCType = ESymbianFATSpecific;
RBuf failedOnBuf;
failedOnBuf.CreateL(gLogFailureData.iFuncName);
gTCId = 0;
RBuf tcUniquePath;
tcUniquePath.CreateL(KNone());
QuickFormat();
CreateTestDirectory(_L("\\F32-TST\\T_FATCHARSETCONV\\"));
_LIT(KTestNormalFileName, "\x65B0\x6587\x4EF6.TXT");
_LIT(KTestNormalFileNameWithUnicode, "___.TXT");
test.Printf(_L("Create a file without the DLL installed, and get the shortname"));
TInt r=TheFile.Create(TheFs,KTestNormalFileName,EFileRead|EFileWrite);
testAndLog(r==KErrNone);
TFileName sn;
r = TheFs.GetShortName(KTestNormalFileName, sn);
testAndLog(r==KErrNone);
r = sn.Compare(KTestNormalFileNameWithUnicode);
testAndLog(r==0);
TheFile.Close();
test.Printf(_L("Access the file without the DLL installed"));
r=TheFile.Open(TheFs,KTestNormalFileName,EFileWrite);
testAndLog(r==KErrNone);
TBuf<50> name;
r=TheFile.FullName(name);
testAndLog(r==KErrNone);
TheFile.Close();
r=TheFile.Open(TheFs,KTestNormalFileNameWithUnicode,EFileWrite);
testAndLog(r==KErrNone);
TheFile.Close();
//load the dll
r = TheFs.ControlIo(CurrentDrive(), KControlIoEnableFatUtilityFunctions);
testAndLog(r==KErrNone);
r = UserSvr::ChangeLocale(KTestLocale);
testAndLog(r==KErrNone);
test.Printf(_L("Access the file with the DLL installed"));
r=TheFile.Open(TheFs,KTestNormalFileName,EFileWrite);
testAndLog(r==KErrNone);
r=TheFile.FullName(name);
testAndLog(r==KErrNone);
TheFile.Close();
r=TheFile.Open(TheFs,KTestNormalFileNameWithUnicode,EFileWrite);
testAndLog(r==KErrNone);
TheFile.Close();
r=TheFs.Delete(KTestNormalFileName);
r = TheFs.ControlIo(CurrentDrive(), KControlIoDisableFatUtilityFunctions);
testAndLog(r==KErrNone);
failedOnBuf.Close();
tcUniquePath.Close();
__UHEAP_MARKEND;
}
void TestVFATCase2()
{
test.Next(_L("Test With VFAT entry, and DOS entry using CP932 Japanese file's access"));
__UHEAP_MARK;
// logging for failure
gTCType = ESymbianFATSpecific;
RBuf failedOnBuf;
failedOnBuf.CreateL(gLogFailureData.iFuncName);
gTCId = 0;
RBuf tcUniquePath;
tcUniquePath.CreateL(KNone());
QuickFormat();
CreateTestDirectory(_L("\\F32-TST\\T_FATCHARSETCONV\\"));
TInt r = TheFs.ControlIo(CurrentDrive(), KControlIoEnableFatUtilityFunctions);
test_KErrNone(r);
r = UserSvr::ChangeLocale(KTestLocale);
test_KErrNone(r);
r=TheFs.SetSessionPath(gSessionPath);
testAndLog(r==KErrNone);
_LIT(KTestNormalFileName, "\x65B0\x6587\x4EF6.TXT");
_LIT(KTestNormalFileShortName, "\x65B0\x6587\x4EF6.TXT");
test.Printf(_L("Create a file with the DLL installed, and get the shortname"));
r=TheFile.Create(TheFs,KTestNormalFileName,EFileRead|EFileWrite);
testAndLog(r==KErrNone);
TFileName sn;
r = TheFs.GetShortName(KTestNormalFileName, sn);
testAndLog(r==KErrNone);
r = sn.Compare(KTestNormalFileShortName);
testAndLog(r==0);
TheFile.Close();
test.Printf(_L("Access the file with the DLL installed"));
r=TheFile.Open(TheFs,KTestNormalFileName,EFileWrite);
testAndLog(r==KErrNone);
TBuf<50> name;
r=TheFile.FullName(name);
testAndLog(r==KErrNone);
TheFile.Close();
r=TheFile.Open(TheFs,KTestNormalFileShortName,EFileWrite);
testAndLog(r==KErrNone);
TheFile.Close();
r = TheFs.ControlIo(CurrentDrive(), KControlIoDisableFatUtilityFunctions);
testAndLog(r==KErrNone);
test.Printf(_L("Access the file without the DLL installed"));
r=TheFile.Open(TheFs,KTestNormalFileName,EFileWrite);
testAndLog(r==KErrNone);
r=TheFile.FullName(name);
testAndLog(r==KErrNone);
TheFile.Close();
r=TheFile.Open(TheFs,KTestNormalFileShortName,EFileWrite);
testAndLog(r==KErrNone);
TheFile.Close();
r=TheFs.Delete(KTestNormalFileName);
failedOnBuf.Close();
tcUniquePath.Close();
__UHEAP_MARKEND;
}
void TestVFATCase1()
{
test.Next(_L("Test Without VFAT entry, but DOS entry uses CP932 Japanese file's access"));
__UHEAP_MARK;
// logging for failure
gTCType = ESymbianFATSpecific;
RBuf failedOnBuf;
failedOnBuf.CreateL(gLogFailureData.iFuncName);
gTCId = 0;
RBuf tcUniquePath;
tcUniquePath.CreateL(KNone());
QuickFormat();
CreateTestDirectory(_L("\\F32-TST\\T_FATCHARSETCONV\\"));
GetBootInfo();
RFile file;
TFileName fn = _L("\\ABCD");
TInt r=file.Create(TheFs,fn,EFileRead);
testAndLog(r==KErrNone);
file.Close();
// Assume this file is the first entry in the root directory
r=TheDisk.Open(TheFs,CurrentDrive());
testAndLog(r==KErrNone);
//-- read the 1st dir entry, it should be a DOS entry
const TInt posEntry1=gBootSector.RootDirStartSector() << KDefaultSectorLog2; //-- dir entry1 position
TFatDirEntry fatEntry1;
TPtr8 ptrEntry1((TUint8*)&fatEntry1,sizeof(TFatDirEntry));
testAndLog(TheDisk.Read(posEntry1, ptrEntry1)==KErrNone);
testAndLog(!fatEntry1.IsVFatEntry());
// Manually modify the short name into unicode characters
// Unicode: 0x(798F 5C71 96C5 6CBB)
// Shift-JIS: 0x(959F 8E52 89EB 8EA1)
TBuf8<8> unicodeSN = _L8("ABCD1234");
unicodeSN[0] = 0x95;
unicodeSN[1] = 0x9F;
unicodeSN[2] = 0x8E;
unicodeSN[3] = 0x52;
unicodeSN[4] = 0x89;
unicodeSN[5] = 0xEB;
unicodeSN[6] = 0x8E;
unicodeSN[7] = 0xA1;
fatEntry1.SetName(unicodeSN);
testAndLog(TheDisk.Write(posEntry1, ptrEntry1)==KErrNone);
TheDisk.Close();
// The Unicode file name of the file that is created
fn = _L("\\ABCD");
fn[1] = 0x798F;
fn[2] = 0x5C71;
fn[3] = 0x96C5;
fn[4] = 0x6CBB;
// Access the file using its unicode file name without the DLL loaded.
r = TheFs.ControlIo(CurrentDrive(), KControlIoDisableFatUtilityFunctions);
test_KErrNone(r);
TEntry entry;
TInt err = TheFs.Entry(fn, entry);
testAndLog(err==KErrNotFound);
// Access the file using its unicode file name with the DLL loaded.
r = TheFs.ControlIo(CurrentDrive(), KControlIoEnableFatUtilityFunctions);
test_KErrNone(r);
r = UserSvr::ChangeLocale(KTestLocale);
test_KErrNone(r);
err = TheFs.Entry(fn, entry);
testAndLog(err==KErrNone);
//file is no more required,delete it.
err = TheFs.Delete(fn);
testAndLog(err==KErrNone);
r = TheFs.ControlIo(CurrentDrive(), KControlIoDisableFatUtilityFunctions);
test_KErrNone(r);
r=TheFs.SessionPath(gSessionPath);
test_KErrNone(r);
failedOnBuf.Close();
tcUniquePath.Close();
__UHEAP_MARKEND;
}
void DoSymbianSpecificCases()
{
gLogFailureData.iTCTypeName = KSymbianFATSpecific;
gLogFailureData.iAPIName= KNone;
// Store current file name
TFileName fileName;
TInt i=0;
while(__FILE__[i]!='\0')
{
fileName.SetLength(i+1);
fileName[i] = __FILE__[i++];
}
gFileName = fileName;
gLogFailureData.iFuncName = KTestLeadingE5Handling;
TestLeadingE5Handling();
gLogFailureData.iFuncName = KTestIllegalCharsWithDll;
TestIllegalCharsWithDll();
gLogFailureData.iFuncName = KTestIllegalCharsWithoutDLL;
TestIllegalCharsWithoutDLL();
gLogFailureData.iFuncName = KTestFileLengthMax;
TestFileLengthMax();
gLogFailureData.iFuncName = KTestFileLengthExceedMax;
TestFileLengthExceedMax();
gLogFailureData.iFuncName = KTestVFATCase2;
TestVFATCase2();
gLogFailureData.iFuncName = KTestVFATCase3;
TestVFATCase3();
gLogFailureData.iFuncName = KTestVFATCase1;
TestVFATCase1();
}
#endif //defined(_DEBUG) || defined(_DEBUG_RELEASE)