--- /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 <e32std.h>
+#include <e32base.h>
+#include <f32file.h>
+#include <apacmdln.h>
+
+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;
+ }
+