applayerprotocols/httptransportfw/Test/T_HttpIntegration/CCmdFile.cpp
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerprotocols/httptransportfw/Test/T_HttpIntegration/CCmdFile.cpp	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,293 @@
+// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "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:
+// $Header$
+// The CTEngine is the class that manages the test infrastructure
+// It knows how to process scripts and where to find command knowledge
+// The plan is:
+// Process console command line or command line supplied script
+// read in each line (or command) and process that (if appropriate)
+// rev:	mjdavey, symbian@mjdss.com, July 2002
+// for:	Typhoon (7.0s) & JetStream (8.0)
+// Include Module Definition & Files  
+// 
+//
+
+#include "CCmdFile.h" 
+
+//-----------------------------------------------------------------------------
+
+CCmdFile *CCmdFile::NewL( )
+{
+CCmdFile* self = NewLC( );
+CleanupStack::Pop();
+return self; 
+}
+
+//-----------------------------------------------------------------------------
+
+CCmdFile *CCmdFile::NewLC()
+{
+CCmdFile* self = new (ELeave) CCmdFile();
+CleanupStack::PushL(self);
+self->ConstructL( );
+return self;
+}
+
+//-----------------------------------------------------------------------------
+
+CCmdFile::~CCmdFile()
+{
+Close();
+iArgs->ResetAndDestroy();
+delete iArgs;
+iArgs = NULL;
+}
+
+//-----------------------------------------------------------------------------
+
+void CCmdFile::ConstructL()
+{
+iFileName.Zero();
+iBuf.Set( NULL, 0 );
+iLine = 0;
+iArgs = new (ELeave) CArrayPtrSeg<HBufC>(32);
+}
+
+//-----------------------------------------------------------------------------
+//	Reads the whole file into memory
+//	Not necessarily ideal - really want to read in line by line as required...
+
+TInt CCmdFile::Open(const TDesC& aPath, const TDesC& aFile)
+{
+// Construct full file name and open the file.
+TInt error = iParse.Set( aFile, NULL, &aPath );
+if (error == KErrNone) 
+	error = Open(iParse.FullName());
+return error;
+}
+
+//-----------------------------------------------------------------------------
+
+TInt CCmdFile::Open(const TDesC& aFile)
+{
+// Close if file is open. Note: the Close() resets the member data.
+Close();
+
+// Connect to file server.
+RFs fs;
+TInt error;
+error = fs.Connect();
+if ( error != KErrNone )
+  return error;
+
+// Open the file.
+RFile file;
+error = file.Open( fs, aFile, EFileStreamText|EFileRead );
+if ( error != KErrNone )
+  {
+	fs.Close();
+  return error;
+  }
+
+// Get file size.
+TInt size;
+error = file.Size( size );
+if ( error != KErrNone )
+  {
+  file.Close();
+  fs.Close();
+  return error;
+  }
+
+// Tackle an empty file => nothing in the iBuf buffer.
+if ( size == 0 )
+  {
+  file.Close();
+  fs.Close();
+  iFileName.Copy( aFile );
+  return error; // = KErrNone
+  }
+
+// Allocate buffer, read in whole file and close it.
+TUint8* buf = (TUint8*)User::Alloc( size );
+if ( buf == NULL )
+  // No memory.
+  {
+  file.Close();
+  fs.Close();
+  return ( error = KErrNoMemory );
+  }
+
+TPtr8 ptr( buf, size );
+error = file.Read( ptr );
+file.Close();
+fs.Close();
+if ( error != KErrNone )
+  // Read error.
+  {
+  delete buf;
+  file.Close();
+  fs.Close();
+  return error;
+  }
+
+file.Close();   // Close file
+fs.Close();     // Close session
+
+#ifndef _UNICODE
+// Set iBuf from which to give lines in Read.
+iBuf.Set( (TText*)buf, size/sizeof(TText) );
+#else
+//	Tackle UNICODE and NON-UNICODE Text files.
+//	the cast is necessary  in order to remove a warning.
+//	It's safe because a size variable it's always positive
+if ( (TUint)size >= sizeof(TText) && buf[0] == 0xFF && buf[1] == 0xFE ) 
+  {
+  // UNICODE: loose 0xFF,0xFE from beginning of the file.
+  Mem::Move( buf, buf+sizeof(TText), size-sizeof(TText) );
+  iBuf.Set( (TText*)buf, size/sizeof(TText)-1 );
+  }
+else
+//  Remark: the size is known to be greater than zero here.
+  {
+  // NON-UNICODE: convert and replace the original buffer.
+  // a) make new buffer
+  TText* newbuf = (TText*)User::Alloc( size*sizeof(TText) );
+  if ( newbuf == NULL )
+      // No memory.
+      {
+      delete buf;
+      return ( error = KErrNoMemory );
+      }
+  // b) convert from old to new buffer
+  TInt i;
+  for ( i = 0; i < size; i++ ) newbuf[i] = buf[i];
+  // c) replace and delete the old one
+  iBuf.Set( newbuf, size );
+  delete buf;
+  }
+#endif
+// Set file name, rewind and return Ok (error = KErrNone).
+iFileName.Copy( aFile );
+Rewind();
+return error; // = KErrNone
+}
+
+//-----------------------------------------------------------------------------
+//	reads a line in 
+
+TInt CCmdFile::Read(TDes& aDes)
+{
+
+// No data.
+aDes.Zero();
+
+// Return End-of-file if there's nothing; also if no file open.
+if ( iBuf.Ptr() == NULL || iBuf.Length() == 0 ) 
+	return KErrEof;
+
+// Return End-of-file also after giving everything from buffer.
+iLex.Mark();
+if (iLex.Eos()) 
+	return KErrEof;
+
+//	Otherwise eat characters up to the end of the line/file and hand over the characters into the descriptor. 
+//	The following skips CRs and handles every LF as end-of-line and hopefully
+//	works right with LF, CRLF and LFCR terminated lines. The CR alone will not do as the end-of-line.
+TChar ch;
+while ( !iLex.Eos() && ( ch = iLex.Get(), ch != '\n' ) )
+  {
+  if ( (ch != '\r') && (aDes.Length() < aDes.MaxLength()) )
+		aDes.Append(ch);
+  }
+
+// Increment line number (read counter) and return KErrNone.
+++iLine;
+return KErrNone;
+}
+
+//-----------------------------------------------------------------------------
+
+TInt CCmdFile::Rewind()
+{
+iLex  = iBuf;
+iLine = 0;
+return KErrNone;
+}
+
+//-----------------------------------------------------------------------------
+
+void CCmdFile::Close()
+{
+//
+// Reset member data.
+if (iBuf.Ptr() != NULL) 
+	delete (TText*)iBuf.Ptr();
+
+iBuf.Set( NULL, 0 );
+iLine = 0;
+iFileName.Zero();
+}
+
+//-----------------------------------------------------------------------------
+//	Add more arguments (makes copies). L E A V E S  on failure.
+
+void CCmdFile::AddArgsL( const TDesC& aArgs )
+{
+TLex  parse(aArgs);
+TPtrC argv;
+while (argv.Set(TfrLex::GetL(parse)), argv.Length() > 0)
+  {
+  argv.Set(TfrLex::Peel(argv));
+  HBufC* buf = argv.AllocL();
+  iArgs->AppendL( buf );
+  }
+}
+
+//-----------------------------------------------------------------------------
+//	Get argument count.
+
+TInt CCmdFile::Argc() const
+{
+return iArgs->Count();
+}
+
+//-----------------------------------------------------------------------------
+//	get the i'th argument, legal i assumed.
+
+TPtrC CCmdFile::Argv(TInt aIndex) const
+{
+TPtrC argv ((iArgs->At(aIndex))->Des());
+return argv;
+}
+
+//-----------------------------------------------------------------------------
+//	Get file name. Having no file does no harm (returns empty name).
+
+TPtrC CCmdFile::FileName() const
+{
+TPtrC filename(iFileName);
+return filename;
+}
+
+//-----------------------------------------------------------------------------
+//	Get line number (= count of lines read so fat). Having no file does no
+//	harm (returns line number 0).
+
+TInt CCmdFile::Line()
+{
+return iLine;
+}
+
+//-----------------------------------------------------------------------------