diff -r 000000000000 -r 7f656887cf89 core/extra/shebang/sbapp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/extra/shebang/sbapp.cpp Wed Jun 23 15:52:26 2010 +0100 @@ -0,0 +1,87 @@ +// sbapp.cpp +// +// Copyright (c) 2007 - 2010 Accenture. All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the "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: +// Accenture - Initial contribution +// + +// Description: +// Launches the executable named in a "shebang" line (e.g "#!fshell") at the beginning of a script. + +#include +#include +#include +#include + +void RunL() + { + CApaCommandLine* commandLine = NULL; + User::LeaveIfError(CApaCommandLine::GetCommandLineFromProcessEnvironment(commandLine)); + CleanupStack::PushL(commandLine); + TFileName scriptFileName(commandLine->DocumentName()); + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + RFile file; + commandLine->GetFileByHandleL(file); + if (!file.SubSessionHandle()) + { + User::LeaveIfError(file.Open(fs, scriptFileName, EFileRead)); + } + RThread().Rendezvous(KErrNone); + CleanupClosePushL(file); + TBuf8<64> buf; + User::LeaveIfError(file.Read(buf)); + CleanupStack::PopAndDestroy(3, commandLine); + if (buf.Left(2) == _L8("#!")) + { + TLex8 lex(buf.Mid(2)); + lex.Mark(); + while (!lex.Eos()) + { + TChar ch(lex.Get()); + if ((ch == TChar('\r')) || (ch == TChar('\n'))) + { + lex.UnGet(); + break; + } + } + TPtrC8 narrowExeName(lex.MarkedToken()); + if (narrowExeName.Length() > 0) + { + TBuf<64> exeName; + exeName.Copy(narrowExeName); + _LIT(KSingleQuote, "'"); + scriptFileName.Insert(0, KSingleQuote); + scriptFileName.Append(KSingleQuote); + RProcess process; + User::LeaveIfError(process.Create(exeName, scriptFileName)); + TRequestStatus status; + process.Logon(status); + process.Resume(); + User::WaitForRequest(status); + User::LeaveIfError(status.Int()); + process.Close(); + } + } + } + +GLDEF_C TInt E32Main() + { + __UHEAP_MARK; + TInt err = KErrNoMemory; + CTrapCleanup* cleanup = CTrapCleanup::New(); + if (cleanup) + { + TRAP(err, RunL()); + delete cleanup; + } + __UHEAP_MARKEND; + return err; + } +