core/src/fshell.cpp
changeset 95 b3ffff030d5c
parent 83 2a78c4ff2eab
--- a/core/src/fshell.cpp	Tue Oct 26 15:36:30 2010 +0100
+++ b/core/src/fshell.cpp	Thu Oct 28 16:54:54 2010 +0100
@@ -117,8 +117,7 @@
 			break;
 			}
 		case EFailedToCreatePipeLine:
-		case EFailedToSetChildErrorVar:
-		case EFailedToSetScriptLineVar:
+		case EPipelineCompletionError:
 		case EUnknown:
 		default:
 			{
@@ -200,8 +199,7 @@
 		CASE_RETURN_LIT(EFailedToCreatePipeLine);
 		CASE_RETURN_LIT(EFailedToConstructCommand);
 		CASE_RETURN_LIT(EFailedToRunCommand);
-		CASE_RETURN_LIT(EFailedToSetChildErrorVar);
-		CASE_RETURN_LIT(EFailedToSetScriptLineVar);
+		CASE_RETURN_LIT(EPipelineCompletionError);
 		CASE_RETURN_LIT(ECommandError);
 		DEFAULT_RETURN_LIT("*** REASON UNKNOWN ***");
 		}
@@ -296,6 +294,7 @@
 
 CShell::~CShell()
 	{
+	iScriptHandle.Close();
 	iJobsLock.Close();
 	iJobs.ResetAndDestroy();
 	delete iScriptArgs;
@@ -303,7 +302,6 @@
 	delete iLineCompleter;
 	delete iConsole;
 	delete iCommandFactory;
-	delete iScriptData;
 	delete iOneLiner;
 	delete iParser;
 	}
@@ -515,7 +513,7 @@
 		{
 		TIoHandleSet ioHandles(IoSession(), Stdin(), Stdout(), Stderr());
 		TBool helpPrinted;
-		iScriptData = ReadScriptL(iScriptName, iScriptArgs, Env(), FsL(), ioHandles, helpPrinted);
+		iScriptHandle = OpenScriptL(iScriptName, iScriptArgs, Env(), FsL(), ioHandles, helpPrinted);
 		if (helpPrinted)
 			{
 			Complete();
@@ -527,7 +525,7 @@
 				{
 				mode |= CParser::EKeepGoing;
 				}
-			iParser = CParser::NewL(mode, *iScriptData, IoSession(), Stdin(), Stdout(), Stderr(), Env(), *iCommandFactory, this);
+			iParser = CParser::NewL(mode, iScriptHandle, IoSession(), Stdin(), Stdout(), Stderr(), Env(), *iCommandFactory, this);
 			RProcess::Rendezvous(KErrNone);
 			iParser->Start();
 			}
@@ -641,8 +639,12 @@
 	return KErrNotFound;
 	}
 
-HBufC* CShell::ReadScriptL(const TDesC& aScriptName, const TDesC* aArguments, IoUtils::CEnvironment& aEnv, RFs& aFs, TIoHandleSet& aIoHandles, TBool& aHelpPrinted, RPointerArray<HBufC>* aAdditionalPrefixArguments)
+RIoReadHandle CShell::OpenScriptL(const TDesC& aScriptName, const TDesC* aArguments, IoUtils::CEnvironment& aEnv, RFs& aFs, TIoHandleSet& aIoHandles, TBool& aHelpPrinted, RPointerArray<HBufC>* aAdditionalPrefixArguments)
 	{
+	RIoReadHandle readHandle;
+	readHandle.CreateL(aIoHandles.IoSession());
+	CleanupClosePushL(readHandle);
+
 	TFileName2 scriptName(aScriptName);
 
 	// Check the scripts dirs in case it wasn't given as an absolute path (although iocli will have made it absolute relative to the pwd)
@@ -670,12 +672,12 @@
 			} 
 		}
 
-	RFile scriptFile;
+	RIoFile scriptFile;
 	TInt err;
 	TInt retries = 5;
 	do
 		{
-		err = scriptFile.Open(aFs, scriptName, EFileRead | EFileShareReadersOnly);
+		err = scriptFile.Create(aIoHandles.IoSession(), scriptName, RIoFile::ERead);
 		if ((err == KErrNone) || (err != KErrInUse))
 			{
 			break;
@@ -686,14 +688,9 @@
 		while (retries >= 0);
 	StaticLeaveIfErr(err, _L("Couldn't open script file %S"), &scriptName);
 	CleanupClosePushL(scriptFile);
-	TInt scriptFileSize;
-	User::LeaveIfError(scriptFile.Size(scriptFileSize));
-	HBufC8* scriptData = HBufC8::NewLC(scriptFileSize);
-	TPtr8 scriptDataPtr(scriptData->Des());
-	User::LeaveIfError(scriptFile.Read(scriptDataPtr));
-	HBufC* decodedScriptData = LtkUtils::DecodeUtf8L(*scriptData);
-	CleanupStack::PopAndDestroy(2, &scriptFile);
-	CleanupStack::PushL(decodedScriptData);
+	scriptFile.AttachL(readHandle, RIoEndPoint::EForeground);
+	CleanupStack::PopAndDestroy(&scriptFile);
+
 	aEnv.SetLocalL(KScriptName);
 	aEnv.SetLocalL(KScriptPath);
 	aEnv.SetLocalL(KScriptLine);
@@ -701,6 +698,7 @@
 	aEnv.SetL(KScriptName, scriptName.NameAndExt());
 	aEnv.SetL(KScriptPath, scriptName.DriveAndPath());
 	aEnv.SetL(_L("0"), scriptName);
+
 	CScriptCommand* scriptCommand = CScriptCommand::NewLC(scriptName, aIoHandles);
 	TRAP(err, scriptCommand->ParseCommandLineArgsL(aArguments ? *aArguments : KNullDesC(), aEnv, aAdditionalPrefixArguments));
 	if (err == KErrArgument || scriptCommand->ShouldDisplayHelp())
@@ -723,8 +721,8 @@
 		}
 	User::LeaveIfError(err); // Propagate error
 	CleanupStack::PopAndDestroy(scriptCommand);
-	CleanupStack::Pop(decodedScriptData);
-	return decodedScriptData;
+	CleanupStack::Pop(&readHandle);
+	return readHandle;
 	}
 
 void CShell::SetToForeground()