--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/baseintegtests/baseintegrationtest/testsuites/common/basedump/src/thindump.cpp Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,264 @@
+// Copyright (c) 1999-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:
+// Thindump is a small tool for dumping text files. The text file
+// given will be dumped using RDebug::Print meaning the text goes to
+// both the console and the Debug Serial Port.
+//
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include <e32test.h>
+#include <f32file.h>
+#ifndef SYMBIAN_BASEDUMP
+#include <s32file.h>
+#include <c32comm.h>
+#include <bacline.h>
+#endif // SYMBIAN_BASEDUMP
+
+
+GLDEF_D RTest gTest(_L("thindump utility"));
+GLDEF_D RFs gFs;
+
+LOCAL_C void SendFileL(const TPtrC &aFilename, const TInt &aPause)
+/**
+Dump narrow text file to console, comms & debug (WINS)
+*/
+ {
+ TInt err;
+
+ // Open file and determine size
+ RFile file;
+ err = file.Open(gFs, aFilename, EFileRead);
+ if( err == KErrNotFound || err == KErrBadName )
+ {
+ gTest.Printf(_L("File %S does not exist"), &aFilename);
+ return;
+ }
+ else if( err == KErrInUse ) // Test Execute opens with ShareAny
+ {
+ gTest.Printf(_L("Open failed as %S is in use. Retry open with EFileShareAny"), &aFilename);
+ err = file.Open(gFs, aFilename, EFileRead|EFileShareAny);
+ }
+
+// gTest.Printf(_L("SendFileL Line %d, RFile::Open err = %d"), __LINE__, err);
+// gTest.Getch();
+ User::LeaveIfError(err);
+
+ TInt size;
+ err = file.Size(size);
+// gTest.Printf(_L("SendFileL Line %d, RFile::Size err = %d"), __LINE__, err);
+// gTest.Getch();
+ User::LeaveIfError(err);
+
+ gTest.Printf(_L("File %S (%d bytes)"), &aFilename, size);
+
+ // Get ready to read file
+ const TInt KBufferSize = 32;
+ const TInt KBufferMaxLength = 1024;
+
+ _LIT(KCharLF, "\x0a");
+ _LIT(KCharCR, "\x0d");
+
+ TInt pos = 0;
+ TInt lfPos;
+ TInt crPos;
+
+ TBuf8<KBufferSize+1> buf8(KBufferSize+1);
+ TBuf<KBufferSize+1> buf16(KBufferSize+1);
+
+ HBufC* format16=HBufC::NewLC(KBufferMaxLength);
+
+ // Read block from file
+ while(pos < size)
+ {
+ err = file.Read(buf8, KBufferSize);
+// gTest.Printf(_L("SendFileL Line %d, RFile::Read err = %d"), __LINE__, err);
+// gTest.Getch();
+ User::LeaveIfError(err);
+
+ // Expand to 16 bit chars
+ buf16.Copy(buf8);
+
+ // Remove carriage returns
+ while ( (crPos = buf16.Find(KCharCR)) != KErrNotFound )
+ buf16.Delete(crPos, 1);
+
+ // Find line feeds
+ TPtr ptr16( format16->Des() );
+ while ( (lfPos = buf16.Find(KCharLF)) != KErrNotFound )
+ {
+ // Extract this line & append to any buffered line
+ TPtrC ptrLeft = buf16.Left(lfPos+1);
+ ptr16.Append(ptrLeft);
+ buf16.Delete(0, lfPos+1);
+
+ // Print this line
+ gTest.Printf(_L("%S"), &ptr16 );
+ ptr16.Zero();
+
+ // Small 10ms pause to prevent data loss during upload
+ User::After(10000);
+ }
+
+ ptr16.Append(buf16);
+ pos += KBufferSize;
+ }
+
+ // Output any partial line still in buffer
+ if (format16->Length())
+ {
+ TPtr ptr16( format16->Des() );
+ gTest.Printf(_L("%S"), &ptr16 );
+ }
+
+ CleanupStack::PopAndDestroy(1, format16);
+
+ if (aPause)
+ {
+ gTest.Printf(_L("Dump complete. Press any key ..."));
+ gTest.Getch();
+ }
+
+ file.Close();
+ }
+
+
+LOCAL_C void InitGlobalsL()
+/**
+Initialise global variables.
+*/
+ {
+ TInt err;
+
+ err = gFs.Connect();
+// gTest.Printf(_L("InitGlobals Line %d, RFs::Connect err = %d"), __LINE__, err);
+// gTest.Getch();
+ User::LeaveIfError(err);
+ }
+
+
+LOCAL_C void DestroyGlobals()
+/**
+Free global variables
+*/
+ {
+ gFs.Close();
+ }
+
+
+LOCAL_C void RunSendFileL()
+/**
+Transmit the file down the Debug Port
+*/
+ {
+ InitGlobalsL();
+
+ TInt pause=EFalse;
+ _LIT(KOptionNoPause,"-nop");
+ _LIT(KOptionPause,"-p");
+ _LIT(KDumpFileDefault, "c:\\log.txt");
+
+ // Obtain command line parameters
+ TPtrC filename( KDumpFileDefault );
+
+#ifndef SYMBIAN_BASEDUMP
+ CCommandLineArguments* args = CCommandLineArguments::NewLC();
+
+ for(TInt i=1;i<args->Count();i++)
+ {
+ if(args->Arg(i).MatchF(KOptionNoPause)==0)
+ {
+ pause=EFalse;
+ }
+ else if(args->Arg(i).MatchF(KOptionPause)==0)
+ {
+ pause=ETrue;
+ }
+ else
+ {
+ filename.Set(args->Arg(i));
+ }
+ }
+#else
+ TBuf<256> cmd;
+ User::CommandLine(cmd);
+ TLex lex(cmd);
+
+ while (!lex.Eos())
+ {
+ TPtrC token;
+ token.Set(lex.NextToken());
+ if (token.Length()==0)
+ {
+ break; // ignore trailing whitespace
+ }
+ else if (token==KOptionNoPause)
+ {
+ pause=EFalse;
+ }
+ else if (token==KOptionPause)
+ {
+ pause=ETrue;
+ }
+ else
+ {
+ filename.Set(token);
+ }
+ }
+#endif
+ SendFileL( filename, pause );
+
+#ifndef SYMBIAN_BASEDUMP
+ CleanupStack::PopAndDestroy(1, args);
+#endif
+ DestroyGlobals();
+ }
+
+
+EXPORT_C TInt E32Main()
+/**
+Main Program
+*/
+ {
+ CTrapCleanup* cleanup = CTrapCleanup::New();
+ CActiveScheduler* theActiveScheduler = new CActiveScheduler();
+ CActiveScheduler::Install(theActiveScheduler);
+
+ __UHEAP_MARK;
+
+ User::ResetInactivityTime();
+
+ gTest.Printf(_L("========== Start Log File =========="));
+
+ TRAPD(err,RunSendFileL());
+ if (err!=KErrNone)
+ {
+ gTest.Printf(_L("thindump left with Error No %d"), err);
+ }
+
+ gTest.Printf(_L("========== Finish Log File =========="));
+
+ gTest.Close();
+
+ __UHEAP_MARKEND;
+
+ delete cleanup;
+ delete theActiveScheduler;
+
+ return KErrNone;
+ }