Update contrib.
1 // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of the License "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
14 // f32test\server\T_Fatcharsetconv_Aux.cpp
19 #include "T_fatcharsetconv_Aux.h"
21 CFileMan* gFileMan = NULL;
22 RPointerArray<RFile>* gFileHandles = NULL;
23 TTestLogFailureData gLogFailureData;
25 TFatBootSector gBootSector;
27 TBool gAutoTest; // is BTB test
33 TFileName gSessionPath;
34 TInt gAllocFailOff=KAllocFailureOff;
35 TInt gAllocFailOn=KAllocFailureOff;
42 GLDEF_C void Format(TInt aDrive)
44 // Format current drive
47 test.Next(_L("Format"));
48 TBuf<4> driveBuf=_L("?:\\");
49 driveBuf[0]=(TText)(aDrive+'A');
52 TInt r=format.Open(TheFs,driveBuf,EQuickFormat,count);
56 TInt r=format.Next(count);
62 void MakeDir(const TDesC& aDirName)
67 TInt r=TheFs.MkDirAll(aDirName);
68 test(r==KErrNone || r==KErrAlreadyExists);
72 void ReportCheckDiskFailure(TInt aRet)
74 // Report the failure of checkdisk
77 test.Printf(_L("CHECKDISK FAILED: "));
80 case 1: test.Printf(_L("File cluster chain contains a bad value (<2 or >maxCluster)\n")); break;
81 case 2: test.Printf(_L("Two files are linked to the same cluster\n")); break;
82 case 3: test.Printf(_L("Unallocated cluster contains a value != 0\n")); break;
83 case 4: test.Printf(_L("Size of file != number of clusters in chain\n")); break;
84 default: test.Printf(_L("Undefined Error value %d\n"),aRet);
89 void CreateTestDirectory(const TDesC& aSessionPath)
91 // Create directory for test
94 TParsePtrC path(aSessionPath);
95 test(path.DrivePresent()==EFalse);
96 TInt r=TheFs.SetSessionPath(aSessionPath);
98 r=TheFs.SessionPath(gSessionPath);
100 r=TheFs.MkDirAll(gSessionPath);
101 test(r==KErrNone || r==KErrAlreadyExists);
104 TInt CurrentDrive(TChar aDriveChar)
106 // Return the current drive number
110 TInt r = TheFs.CharToDrive(aDriveChar,driveNum);
112 gDriveToTest = gSessionPath[0] = (TText)aDriveChar;
118 // Return the current drive number
122 TInt r = TheFs.CharToDrive(gSessionPath[0],driveNum);
127 void MakeFile(const TDesC& aFileName,const TUidType& aUidType,const TDesC8& aFileContents)
129 // Make a file and write uid and data
133 TInt r=file.Replace(TheFs,aFileName,0);
134 test(r==KErrNone || r==KErrPathNotFound);
135 if (r==KErrPathNotFound)
137 r=TheFs.MkDirAll(aFileName);
139 r=file.Replace(TheFs,aFileName,0);
142 TCheckedUid checkedUid(aUidType);
143 TPtrC8 uidData((TUint8*)&checkedUid,sizeof(TCheckedUid));
144 r=file.Write(uidData);
146 r=file.Write(aFileContents);
151 void MakeFile(const TDesC& aFileName,const TDesC8& aFileContents)
153 // Make a file and write something in it
157 TInt r=file.Replace(TheFs,aFileName,0);
158 if(r!=KErrNone && r!=KErrPathNotFound)
160 test.Printf(_L("ERROR: r=%d"),r);
163 test(r==KErrNone || r==KErrPathNotFound);
164 if (r==KErrPathNotFound)
166 r=TheFs.MkDirAll(aFileName);
168 r=file.Replace(TheFs,aFileName,0);
171 r=file.Write(aFileContents);
176 void MakeFile(const TDesC& aFileName,TInt anAttributes)
178 // Make a file and write something in it
182 TInt r=file.Replace(TheFs,aFileName,0);
183 test(r==KErrNone || r==KErrPathNotFound);
184 if (r==KErrPathNotFound)
186 r=TheFs.MkDirAll(aFileName);
188 r=file.Replace(TheFs,aFileName,0);
192 r=TheFs.SetAtt(aFileName,anAttributes,0);
196 void MakeFile(const TDesC& aFileName)
201 MakeFile(aFileName,_L8(""));
204 #if defined(_DEBUG) || defined(_DEBUG_RELEASE)
207 FormatFatDrive(TheFs, CurrentDrive(), ETrue);
210 void ReadBootSector(TFatBootSector& aBootSector)
212 TInt r = ReadBootSector(TheFs, CurrentDrive(), KBootSectorNum<<KDefaultSectorLog2, aBootSector);
215 if(!aBootSector.IsValid())
217 test.Printf(_L("Wrong bootsector! Dump:\n"));
218 aBootSector.PrintDebugInfo();
226 ReadBootSector(gBootSector);
230 void CheckIfIOTesting(TTestSwitches& aSwitches)
232 if( ((aSwitches.iExeOnSymbian || aSwitches.iExeOnWindows) && !(aSwitches.iVerOnSymbian || aSwitches.iVerOnWindows))
233 ||((aSwitches.iVerOnSymbian || aSwitches.iVerOnWindows) && !(aSwitches.iExeOnSymbian || aSwitches.iExeOnWindows))
242 TInt r=TheFs.CheckDisk(gSessionPath);
243 if (r!=KErrNone && r!=KErrNotSupported)
244 ReportCheckDiskFailure(r);
245 r = TheFs.ScanDrive(gSessionPath);
246 if (r!=KErrNone && r!=KErrNotSupported && r!=KErrInUse)
247 ReportCheckDiskFailure(r);
252 gLogFailureData.iExeOsName = KNone;
253 gLogFailureData.iVerOsName = KNone;
254 gLogFailureData.iExeDrive = 'A';
255 gLogFailureData.iVerDrive = 'A';
258 void ClearTCLogData()
260 gLogFailureData.iTCTypeName.SetLength(0);
261 gLogFailureData.iTCFailureOn.SetLength(0);
262 gLogFailureData.iTCId = 0;
263 gLogFailureData.iTCUniquePath.SetLength(0);
264 gLogFailureData.iAPIName.SetLength(0);
265 gLogFailureData.iLineNum = 0;
266 // gLogFailureData.iFileName.SetLength(0);
270 * Search test cases by the index of the array of test case group, overloaded version for basic unitary cases.
271 * @param aIdx the test case index in search
272 * @param aBasicUnitaryTestCaseGroup the input test group, should always be gBasicUnitaryTestCases[]
273 * @param aTestCaseFound contains params of the test case found by the test case Id.
274 * @return KErrNone if only one test case on the id is found
275 * KErrNotFound if no test case is found
277 TInt SearchTestCaseByArrayIdx(TUint aIdx, const TTestCaseUnitaryBasic aBasicUnitaryTestCaseGroup[],
278 TTestParamAll& aTestCaseFound, TBool aIsWithDLL=EFalse)
280 if (aBasicUnitaryTestCaseGroup[aIdx].iBasic.iTestCaseID != 0)
282 aTestCaseFound.iTestCaseID = aBasicUnitaryTestCaseGroup[aIdx].iBasic.iTestCaseID;
283 aTestCaseFound.iAPI = aBasicUnitaryTestCaseGroup[aIdx].iBasic.iAPI;
285 aTestCaseFound.iSrcDrvChar = aBasicUnitaryTestCaseGroup[aIdx].iSrcPrsBasic.iDrvChar;
286 aTestCaseFound.iSrcCmdPath.Copy(aBasicUnitaryTestCaseGroup[aIdx].iSrcPrsBasic.iCmdPath);
287 aTestCaseFound.iSrcPrsPath.Copy(aBasicUnitaryTestCaseGroup[aIdx].iSrcPrsBasic.iPrsPath);
288 aTestCaseFound.iSrcPrsFiles = aBasicUnitaryTestCaseGroup[aIdx].iSrcPrsBasic.iPrsFiles;
290 aTestCaseFound.iIsWithDLL = aIsWithDLL;
292 // To make every test case uniquely indentified for interOP
293 // update the test case id and its path correspondingly
294 TBuf<15> tempName = _L("_");
295 if(aTestCaseFound.iIsWithDLL)
296 tempName.Append(_L("DLL"));
298 tempName.Append(_L("NDLL"));
300 TInt idx = aTestCaseFound.iSrcCmdPath.Find(_L("\\Src\\"));
301 aTestCaseFound.iSrcCmdPath.Insert(idx, tempName);
302 aTestCaseFound.iSrcPrsPath.Insert(idx, tempName);
310 * Search test cases by the index of the array of test case group, overloaded version for basic binary cases.
311 * @param aIdx the test case index in search
312 * @param aBasicUnitaryTestCaseGroup the input test group, should always be gBasicBinaryTestCases[]
313 * @param aTestCaseFound contains params of the test case found by the test case Id.
314 * @return KErrNone if only one test case on the id is found
315 * KErrNotFound if no test case is found
317 TInt SearchTestCaseByArrayIdx(TUint aIdx, const TTestCaseBinaryBasic aBasicBinaryTestCaseGroup[],
318 TTestParamAll& aTestCaseFound, TBool aIsWithDLL=EFalse)
320 if (aBasicBinaryTestCaseGroup[aIdx].iBasic.iTestCaseID != 0)
322 aTestCaseFound.iTestCaseID = aBasicBinaryTestCaseGroup[aIdx].iBasic.iTestCaseID;
323 aTestCaseFound.iAPI = aBasicBinaryTestCaseGroup[aIdx].iBasic.iAPI;
325 aTestCaseFound.iSrcDrvChar = aBasicBinaryTestCaseGroup[aIdx].iSrcPrsBasic.iDrvChar;
326 aTestCaseFound.iSrcCmdPath.Copy(aBasicBinaryTestCaseGroup[aIdx].iSrcPrsBasic.iCmdPath);
327 aTestCaseFound.iSrcPrsPath.Copy(aBasicBinaryTestCaseGroup[aIdx].iSrcPrsBasic.iPrsPath);
328 aTestCaseFound.iSrcPrsFiles = aBasicBinaryTestCaseGroup[aIdx].iSrcPrsBasic.iPrsFiles;
330 aTestCaseFound.iTrgDrvChar = aBasicBinaryTestCaseGroup[aIdx].iTrgPrsBasic.iDrvChar;
331 aTestCaseFound.iTrgCmdPath.Copy(aBasicBinaryTestCaseGroup[aIdx].iTrgPrsBasic.iCmdPath);
333 aTestCaseFound.iIsWithDLL = aIsWithDLL;
334 // To make every test case uniquely indentified for interOP
335 // update the test case id and its path correspondingly
337 TInt idx = aTestCaseFound.iSrcCmdPath.Find(_L("\\T_FCSC\\")) + 8 /* Len of \\T_FCSC\\ */;
339 while(aTestCaseFound.iSrcCmdPath[idx] != '\\')
341 tempBuf.SetLength(i+1);
342 tempBuf[i++] = aTestCaseFound.iSrcCmdPath[idx++];
344 tempBuf.Append(_L("_"));
345 if(aTestCaseFound.iIsWithDLL)
346 tempBuf.Append(_L("DLL"));
348 tempBuf.Append(_L("NDLL"));
351 idx = aTestCaseFound.iSrcCmdPath.Find(_L("\\T_FCSC\\")) + 8;
352 while(aTestCaseFound.iSrcCmdPath[idx] != '\\')
355 aTestCaseFound.iSrcCmdPath[idx++];
357 aTestCaseFound.iSrcCmdPath.Replace(idx-len, len, tempBuf);
360 idx = aTestCaseFound.iSrcPrsPath.Find(_L("\\T_FCSC\\")) + 8;
361 while(aTestCaseFound.iSrcPrsPath[idx] != '\\')
364 aTestCaseFound.iSrcCmdPath[idx++];
366 aTestCaseFound.iSrcPrsPath.Replace(idx-len, len, tempBuf);
369 idx = aTestCaseFound.iTrgCmdPath.Find(_L("\\T_FCSC\\")) + 8;
370 while(aTestCaseFound.iTrgCmdPath[idx] != '\\')
373 aTestCaseFound.iTrgCmdPath[idx++];
375 aTestCaseFound.iTrgCmdPath.Replace(idx-len, len, tempBuf);
386 RDebug::Print(_L("t_fatcharsetconv [-x {s,w}] [-d {dt}][-v {sw}]"));
387 RDebug::Print(_L("\t-x : for executing tests"));
388 RDebug::Print(_L("\t\t s or S for execution on Symbian"));
389 RDebug::Print(_L("\t\t w or W for execution on Windows"));
390 RDebug::Print(_L("\t-d: drive to test for execution/verification"));
391 RDebug::Print(_L("\t\t This test runs on FAT or Win32 file systems only"));
392 RDebug::Print(_L("\t\t d or D for test drive on Symbian (FAT file system)"));
393 RDebug::Print(_L("\t\t Any FAT/Win32 file system drive on emulator i.e. T, X etc"));
394 RDebug::Print(_L("\t-v : for validating tests"));
395 RDebug::Print(_L("\t\t s or S for verification on symbian"));
396 RDebug::Print(_L("\t\t w or W for verification on Windows"));
399 void ClearSwitches(TTestSwitches& aSwitches)
401 // clear the switches
402 aSwitches.iExeOnSymbian = EFalse;
403 aSwitches.iVerOnSymbian = EFalse;
404 aSwitches.iExeOnWindows = EFalse;
405 aSwitches.iVerOnWindows = EFalse;
406 aSwitches.iExeDriveChar =' ';
407 aSwitches.iVerDriveChar =' ';
408 aSwitches.iExeDriveNum =0;
409 aSwitches.iVerDriveNum =0;
410 aSwitches.iMountedFSName.SetLength(0);
414 void ParseCommandArguments(TTestSwitches& aSwitches)
417 User::CommandLine(cmd);
418 RDebug::Print(_L("Command Line : %S"), &cmd);
419 TChar testDrive = 'C';
422 ClearSwitches(aSwitches);
424 TFileName currentFile=RProcess().FileName();
426 TPtrC token=lex.NextToken();
427 if (token.MatchF(currentFile)==0)
429 token.Set(lex.NextToken());
431 if (token.Length()==0)
433 testDrive = 'C'; // default drives
436 else if((token[0] >='A' && token[0]<='Z') || (token[0] >='a' && token[0]<='z'))
438 testDrive = token[0];
445 if (token.Length()==0)
447 continue; // ignore trailing whitespace
449 if (token==_L("-x") || token==_L("-X"))
451 token.Set(lex.NextToken());
452 if((token==_L("s")) || (token==_L("S")))
454 aSwitches.iExeOnSymbian = ETrue;
455 gLogFailureData.iExeOsName = KSymbian;
457 else if((token==_L("w")) || (token==_L("W")))
459 aSwitches.iExeOnWindows = ETrue;
460 gLogFailureData.iExeOsName = KWindows;
462 token.Set(lex.NextToken());
465 if (token==_L("-d") || token==_L("-D"))
467 token.Set(lex.NextToken());
468 testDrive = token[0];
469 token.Set(lex.NextToken());
472 if (token==_L("-v") || token==_L("-V"))
474 token.Set(lex.NextToken());
475 if((token==_L("s")) || (token==_L("S")))
477 aSwitches.iVerOnSymbian = ETrue;
478 gLogFailureData.iVerOsName = KSymbian;
480 else if((token==_L("w")) || (token==_L("W")))
482 aSwitches.iVerOnWindows = ETrue;
483 gLogFailureData.iVerOsName = KWindows;
485 token.Set(lex.NextToken());
488 RDebug::Print(_L("Unknown option %S"), &token);
494 CheckIfIOTesting(aSwitches);
505 testDrive.UpperCase();
508 #if defined (__WINS__)
510 aSwitches.iExeOnWindows = ETrue;
511 aSwitches.iExeDriveChar = testDrive;
512 aSwitches.iExeDriveNum = CurrentDrive(aSwitches.iExeDriveChar);
513 gLogFailureData.iExeDrive = aSwitches.iExeDriveChar;
514 gLogFailureData.iExeOsName = KWindows;
516 aSwitches.iVerOnWindows = ETrue;
517 aSwitches.iVerDriveChar = testDrive;
518 aSwitches.iVerDriveNum = CurrentDrive(aSwitches.iVerDriveChar);
519 gLogFailureData.iVerDrive = aSwitches.iVerDriveChar;
520 gLogFailureData.iVerOsName = KWindows;
523 aSwitches.iExeOnSymbian = ETrue;
524 aSwitches.iExeDriveChar = testDrive;
525 aSwitches.iExeDriveNum = CurrentDrive(aSwitches.iExeDriveChar);
526 gLogFailureData.iExeDrive = aSwitches.iExeDriveChar;
527 gLogFailureData.iExeOsName = KSymbian;
529 aSwitches.iVerOnSymbian = ETrue;
530 aSwitches.iVerDriveChar = testDrive;
531 aSwitches.iVerDriveNum = CurrentDrive(aSwitches.iVerDriveChar);
532 gLogFailureData.iVerDrive = aSwitches.iVerDriveChar;
533 gLogFailureData.iVerOsName = KSymbian;
537 if(aSwitches.iExeOnWindows || aSwitches.iExeOnSymbian)
539 aSwitches.iExeDriveChar = testDrive;
540 aSwitches.iExeDriveNum = CurrentDrive(aSwitches.iExeDriveChar);
541 gLogFailureData.iExeDrive = aSwitches.iExeDriveChar;
543 if(aSwitches.iVerOnWindows || aSwitches.iVerOnSymbian)
545 aSwitches.iVerDriveChar = testDrive;
546 aSwitches.iVerDriveNum = CurrentDrive(aSwitches.iVerDriveChar);
547 gLogFailureData.iVerDrive = aSwitches.iVerDriveChar;
553 gFileMan=CFileMan::NewL(TheFs);
556 void RmDir(const TDesC& aDirName)
558 TFileName filename_dir = aDirName;
560 r = TheFs.SetAtt(filename_dir, 0, KEntryAttReadOnly);
562 r=gFileMan->RmDir(filename_dir);
563 test(r==KErrNone || r==KErrNotFound || r==KErrPathNotFound || r==KErrInUse);
566 // Cleanup test variables
573 Parsing Dir Data Block
574 @param aDataBlock data block in TInt[] for parsing
575 @param aDirDataArray returning dir data array after parsing
577 @panic if data setup error
579 void ParsingDirDataBlock(const TInt aDataBlock[], RArray<TInt>& aDirDataArray)
582 aDirDataArray.Reset();
584 if (aDataBlock[0] == EOB)
592 TInt lastItem = aDataBlock[i-1];
593 TInt currentItem = aDataBlock[i];
596 if (currentItem == EOB)
598 if (lastItem == CON || lastItem > LAST)
601 test.Printf(_L("ERROR<SetupDir>: wrong dir data setup! err=%d\n"), err);
605 // passed, insert last, break
607 err = aDirDataArray.InsertInOrder(lastItem);
608 if (err != KErrNone && err != KErrAlreadyExists)
610 test.Printf(_L("ERROR<SetupDir>: wrong dir data setup! err=%d\n"), err);
616 else if (currentItem == CON)
619 if (lastItem == CON || lastItem >= LAST)
622 test.Printf(_L("ERROR<SetupDir>: wrong dir data setup! err=%d\n"), err);
625 else // last < LAST, last != CON
628 TInt nextItem = aDataBlock[i+1];
629 if (nextItem <= 0 || nextItem > LAST || lastItem >= nextItem)
631 test.Printf(_L("ERROR<SetupDir>: wrong dir data setup! err=%d\n"), err);
637 for (TInt j = lastItem; j < nextItem; j++)
639 err = aDirDataArray.InsertInOrder(j);
640 if (err != KErrNone && err != KErrAlreadyExists)
642 test.Printf(_L("ERROR<SetupDir>: wrong dir data setup! err=%d\n"), err);
650 else if (0 <= currentItem && currentItem <= LAST)
651 // if current == normal item
658 else if (lastItem >= LAST)
661 test.Printf(_L("ERROR<SetupDir>: wrong dir data setup! err=%d\n"), err);
665 // passed, insert last
667 err = aDirDataArray.InsertInOrder(lastItem);
668 if (err != KErrNone && err != KErrAlreadyExists)
670 test.Printf(_L("ERROR<SetupDir>: wrong dir data setup! err=%d\n"), err);
676 else // invalid input
678 test.Printf(_L("ERROR<SetupDir>: wrong dir data setup! err=%d\n"), err);
685 Setup dir structure for testing and verifying functional results
686 @param datastr data structure to setup directory
687 @param iOperation Operation to be performed
688 @param SrcDrive Source drive
689 @param Targetdrive Target drive input
690 @panic if data structure definition is incorrect
692 void SetupDirFiles(const TDesC& aPath, const TDirSetupFiles& aDirFiles)
694 TFileName path = aPath;
695 if (path.Length() == 0)
697 test.Printf(_L("ERROR<SetupDirFiles()>: Zero length src path!\n"));
703 RArray<TInt> addBlockDataArray;
704 RArray<TInt> deductBlockDataArray;
706 ParsingDirDataBlock(aDirFiles.iAddingBlock, addBlockDataArray);
707 ParsingDirDataBlock(aDirFiles.iDeductBlock, deductBlockDataArray);
709 if (addBlockDataArray.Count() == 0)
714 for (TInt i = 0; i < deductBlockDataArray.Count(); ++i)
716 TInt idxToDelete = addBlockDataArray.FindInOrder(deductBlockDataArray[i]);
717 if (idxToDelete >= 0)
719 addBlockDataArray.Remove(idxToDelete);
721 else if (idxToDelete == KErrNotFound)
727 test.Printf(_L("ERROR<<SetupDir>>: wrong dir data setup! err=%d\n"), idxToDelete);
731 if (addBlockDataArray.Count() > 0)
733 for (TInt i = 0; i < addBlockDataArray.Count(); ++i)
735 TInt idx = addBlockDataArray[i];
737 path += gDirPatterns[idx];
738 if (path[path.Length() - 1] == '\\')
744 MakeFile(path, _L8("blahblah"));
749 addBlockDataArray.Reset();
750 deductBlockDataArray.Reset();
753 void LogTestFailureData(TTCType tcType, TFileName failedOn,
754 TUint tcId, TFileName tcUniquePath, TInt line)
756 if(tcType == EUnitaryTest)
757 gLogFailureData.iTCTypeName = KUnitary;
758 else if(tcType == EBinaryTest)
759 gLogFailureData.iTCTypeName = KBinary;
760 gLogFailureData.iTCFailureOn = failedOn;
761 gLogFailureData.iTCId = tcId;
762 gLogFailureData.iTCUniquePath.Copy(tcUniquePath);
763 gLogFailureData.iLineNum = line;
764 gLogFailureData.iFileName.Copy(gFileName);
769 TFileName logFileName;
772 if(failedOn == KExecution)
774 logFileName.Append(KExeLogFileName);
778 logFileName.Append(KVerLogFileName);
783 logFileName.Append(KLogFileName);
786 logFileName.Append(KUnderScore);
787 logFileName.Append(gDriveToTest);
788 logFileName.Append(KExtension);
790 TInt r = file.Create(TheFs, logFileName, EFileRead|EFileWrite);
791 test(r == KErrNone || r == KErrAlreadyExists);
795 tempBuf.Append(KLogFileHeader);
799 if (r == KErrAlreadyExists)
801 r = file.Open(TheFs, logFileName, EFileRead|EFileWrite);
804 r=file.Seek(ESeekEnd,start);
808 tempBuf.SetLength(0);
809 tempBuf.Append(KNewLine);
811 tempBuf.Append(KYes);
814 tempBuf.Append(KComma);
817 tempBuf.SetLength(0);
818 tempBuf.Append(gLogFailureData.iTCTypeName);
819 tempBuf.Append(KComma);
822 tempBuf.SetLength(0);
823 tempBuf.Append(gLogFailureData.iTCFailureOn);
824 tempBuf.Append(KComma);
827 tempBuf.SetLength(0);
828 tempBuf.AppendNum(gLogFailureData.iTCId);
829 tempBuf.Append(KComma);
832 tempBuf.SetLength(0);
833 tempBuf.Append(gLogFailureData.iTCUniquePath);
834 tempBuf.Append(KComma);
837 tempBuf.SetLength(0);
838 tempBuf.Append(gLogFailureData.iFSName);
839 tempBuf.Append(KComma);
842 tempBuf.SetLength(0);
843 tempBuf.Append(gLogFailureData.iExeOsName);
844 tempBuf.Append(KComma);
847 tempBuf.SetLength(0);
848 tempBuf.Append(gLogFailureData.iExeDrive);
849 tempBuf.Append(KComma);
852 tempBuf.SetLength(0);
853 tempBuf.Append(gLogFailureData.iVerOsName);
854 tempBuf.Append(KComma);
857 tempBuf.SetLength(0);
858 tempBuf.Append(gLogFailureData.iVerDrive);
859 tempBuf.Append(KComma);
862 tempBuf.SetLength(0);
863 tempBuf.Append(gLogFailureData.iAPIName);
864 tempBuf.Append(KComma);
867 tempBuf.SetLength(0);
868 tempBuf.AppendNum(gLogFailureData.iLineNum);
869 tempBuf.Append(KComma);
872 tempBuf.SetLength(0);
873 tempBuf.Append(gLogFailureData.iFuncName);
874 tempBuf.Append(KComma);
877 tempBuf.SetLength(0);
878 tempBuf.Append(gLogFailureData.iFileName);