diff -r 000000000000 -r bde4ae8d615e os/kernelhwsrv/kerneltest/f32test/cfileman/t_cfileman_aux.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/kernelhwsrv/kerneltest/f32test/cfileman/t_cfileman_aux.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,398 @@ +// Copyright (c) 2008-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: +// f32test\cfileman\t_cfileman_aux.cpp +// +// + +#include "t_cfileman_aux.h" + +CFileMan* gFileMan = NULL; +RPointerArray* gFileHandles = NULL; +TBool gAsynch = EFalse; +TRequestStatus gStat; +TBool testingInvalidPathLengths; + +void InitialiseL() + { + gFileMan=CFileMan::NewL(TheFs); + } + +void RmDir(const TDesC& aDirName) + { + TFileName filename_dir = aDirName; + TInt r = 0; + r = TheFs.SetAtt(filename_dir, 0, KEntryAttReadOnly); + r=gFileMan->RmDir(filename_dir); + test(r==KErrNone || r==KErrNotFound || r==KErrPathNotFound); + } + +// Cleanup test variables +void Cleanup() + { + delete gFileMan; + } + +//Test that the contents of two directories are identical +TBool CompareL(const TDesC& aDir1,const TDesC& aDir2) + { + TBool rel = ETrue; + CDirScan* scanDir1=CDirScan::NewL(TheFs); + scanDir1->SetScanDataL(aDir1,KEntryAttMaskSupported,ESortByName); + CDirScan* scanDir2=CDirScan::NewL(TheFs); + scanDir2->SetScanDataL(aDir2,KEntryAttMaskSupported,ESortByName); + + FOREVER + { + CDir* entryList1; + CDir* entryList2; + + scanDir1->NextL(entryList1); + scanDir2->NextL(entryList2); + + if (entryList1==NULL || entryList2==NULL) + { + if (!(entryList1==NULL && entryList2==NULL)) + { + delete entryList1, + delete entryList2, + delete scanDir1, + delete scanDir2; + return(EFalse); + } + break; + } + + TFileName abbPath1=scanDir1->AbbreviatedPath(); + TFileName abbPath2=scanDir2->AbbreviatedPath(); + if (!(abbPath1==abbPath2)) + { + delete entryList1, + delete entryList2, + delete scanDir1, + delete scanDir2; + return(EFalse); + } + + TInt count1=entryList1->Count(); + TInt count2=entryList2->Count(); + if (!(count1==count2)) + { + delete entryList1, + delete entryList2, + delete scanDir1, + delete scanDir2; + return(EFalse); + } + + while(count1--) + { + TEntry entry1=(*entryList1)[count1]; + TEntry entry2=(*entryList2)[count1]; + if (!(entry1.iName==entry2.iName)) + { + delete entryList1, + delete entryList2, + delete scanDir1, + delete scanDir2; + return(EFalse); + } + if (!(entry1.iAtt==entry2.iAtt)) + { + delete entryList1, + delete entryList2, + delete scanDir1, + delete scanDir2; + return(EFalse); + } + + } + + delete entryList1; + delete entryList2; + } + + delete scanDir1; + delete scanDir2; + + return rel; + } + +/** + Parsing Dir Data Block + @param aDataBlock data block in TInt[] for parsing + @param aDirDataArray returning dir data array after parsing + + @panic if data setup error + +*/ +void ParsingDirDataBlock(const TInt aDataBlock[], RArray& aDirDataArray) + { + TInt err = KErrNone; + aDirDataArray.Reset(); + + if (aDataBlock[0] == EOB) + { + return; + } + + TInt i = 1; + FOREVER + { + TInt lastItem = aDataBlock[i-1]; + TInt currentItem = aDataBlock[i]; + + // check currentItem + if (currentItem == EOB) + { + if (lastItem == CON || lastItem > LAST) + //check last + { + test.Printf(_L("ERROR: wrong dir data setup! err=%d\n"), err); + test(EFalse); + } + else + // passed, insert last, break + { + err = aDirDataArray.InsertInOrder(lastItem); + if (err != KErrNone && err != KErrAlreadyExists) + { + test.Printf(_L("ERROR: wrong dir data setup! err=%d\n"), err); + test(EFalse); + } + break; + } + } + + else if (currentItem == CON) + // if current == CON + { + if (lastItem == CON || lastItem >= LAST) + // check last item + { + test.Printf(_L("ERROR: wrong dir data setup! err=%d\n"), err); + test(EFalse); + } + else // last < LAST, last != CON + { + // check next item + TInt nextItem = aDataBlock[i+1]; + if (nextItem <= 0 || nextItem > LAST || lastItem >= nextItem) + { + test.Printf(_L("ERROR: wrong dir data setup! err=%d\n"), err); + test(EFalse); + } + else + { + // all valid + for (TInt j = lastItem; j < nextItem; j++) + { + err = aDirDataArray.InsertInOrder(j); + if (err != KErrNone && err != KErrAlreadyExists) + { + test.Printf(_L("ERROR: wrong dir data setup! err=%d\n"), err); + test(EFalse); + } + } + } + } + i++; + } + + else if (0 <= currentItem && currentItem <= LAST) + // if current == normal item + { + if (lastItem == CON) + { + i++; + continue; + } + else if (lastItem >= LAST) + // check last item + { + test.Printf(_L("ERROR: wrong dir data setup! err=%d\n"), err); + test(EFalse); + } + else + // passed, insert last + { + err = aDirDataArray.InsertInOrder(lastItem); + if (err != KErrNone && err != KErrAlreadyExists) + { + test.Printf(_L("ERROR: wrong dir data setup! err=%d\n"), err); + test(EFalse); + } + } + i++; + } + + else // invalid input + { + test.Printf(_L("ERROR: wrong dir data setup! err=%d\n"), err); + test(EFalse); + } + } + } + + +/** + Setup attribs: + @param filenamedir root path of dir data or a file data + @param mode value of an mode to be set(Normal/Open/Shared..) +*/ +void OpenFile(TDesC& aFile, TFileMode aFileMode) + { + RFile* file = new (ELeave) RFile; + gFileHandles->Append(file); + TInt ret = 0; + ret = file->Open(TheFs, aFile, aFileMode); + test(ret==KErrNone); + } + + +/** + Setup dir structure for testing and verifying functional results + @param datastr data structure to setup directory + @param iOperation Operation to be performed + @param SrcDrive Source drive + @param Targetdrive Target drive input + @panic if data structure definition is incorrect +*/ +void SetupDirFiles(const TDesC& aPath, const TDirSetupFiles& aDirFiles) + { + TFileName path = aPath; + if (path.Length() == 0) + { + test.Printf(_L("ERROR: Zero length src path!\n")); + test(EFalse); + } + + RmDir(path); + MakeDir(path); + + RArray addBlockDataArray; + RArray deductBlockDataArray; + + ParsingDirDataBlock(aDirFiles.iAddingBlock, addBlockDataArray); + ParsingDirDataBlock(aDirFiles.iDeductBlock, deductBlockDataArray); + + if (addBlockDataArray.Count() == 0) + // empty dir setup + { + return; + } + else + { + for (TInt i = 0; i < deductBlockDataArray.Count(); ++i) + { + TInt idxToDelete = addBlockDataArray.FindInOrder(deductBlockDataArray[i]); + if (idxToDelete >= 0) + { + addBlockDataArray.Remove(idxToDelete); + } + else if (idxToDelete == KErrNotFound) + { + continue; + } + else + { + test.Printf(_L("ERROR<>: wrong dir data setup! err=%d\n"), idxToDelete); + test(EFalse); + } + } + } + + if (addBlockDataArray.Count() > 0) + { + for (TInt i = 0; i < addBlockDataArray.Count(); ++i) + { + TInt idx = addBlockDataArray[i]; + path = aPath; + path += gDirPatterns[idx]; + if (path[path.Length() - 1] == '\\') + { + MakeDir(path); + } + else + { + MakeFile(path, _L8("blahblah")); + + } + } + } + + addBlockDataArray.Reset(); + deductBlockDataArray.Reset(); + } + +/** + Print out all items in aPath + @param aPath root path for scanning + + @panic SetScanData error +*/ +void PrintDir(const TDesC& aPath, const TChar& aDrv) + { + TFileName fn; + if (aPath.Length() == 0) + { + return; + } + else + { + fn = aPath; + fn[0] = (TUint16)aDrv; + test.Printf(_L("==============================\n")); + test.Printf(_L("<>: root = \"%S\"\n"), &fn); + } + + CDirScan* scan = CDirScan::NewL(TheFs); + TUint entryAttMask = KEntryAttMaskSupported; + TUint entrySortMask = EDirsLast|EAscending; + CDirScan::TScanDirection scanDirection = CDirScan::EScanDownTree; + + + TRAPD(err, scan->SetScanDataL(fn, entryAttMask, entrySortMask, scanDirection)); + test(err == KErrNone); + + CDir* dir = NULL; + TInt i = 0; + TBool temp_val = ETrue; + while (temp_val) + { + scan->NextL(dir); + if (dir != NULL) + { + for (TInt j = 0; j < dir->Count(); ++j) + { + TFileName item(fn.Left(aPath.Length() - 1)); + item.Append(scan->AbbreviatedPath()); + TEntry dummy = (*dir)[j]; + item.Append(dummy.iName); + if (dummy.iAtt & KEntryAttDir) + { + item.Append('\\'); + } + test.Printf(_L("<>: item %d: \"%S\"\n"), i, &item); + ++i; + } + delete dir; + dir = NULL; + } + else + { + break; + } + } + delete scan; + }