--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/cfileman/t_cfileman_aux.cpp Mon Oct 19 15:55:17 2009 +0100
@@ -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<RFile>* 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<TInt>& 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<SetupDir>: 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<SetupDir>: 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<SetupDir>: 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<SetupDir>: 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<SetupDir>: 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<SetupDir>: 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<SetupDir>: wrong dir data setup! err=%d\n"), err);
+ test(EFalse);
+ }
+ }
+ i++;
+ }
+
+ else // invalid input
+ {
+ test.Printf(_L("ERROR<SetupDir>: 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<SetupDirFiles()>: Zero length src path!\n"));
+ test(EFalse);
+ }
+
+ RmDir(path);
+ MakeDir(path);
+
+ RArray<TInt> addBlockDataArray;
+ RArray<TInt> 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<<SetupDir>>: 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("<<PrintDir>>: 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("<<PrintDir>>: item %d: \"%S\"\n"), i, &item);
+ ++i;
+ }
+ delete dir;
+ dir = NULL;
+ }
+ else
+ {
+ break;
+ }
+ }
+ delete scan;
+ }