summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Glazounov <vg@openoffice.org>2008-02-12 16:25:05 +0000
committerVladimir Glazounov <vg@openoffice.org>2008-02-12 16:25:05 +0000
commit5629b13246496eba9cee2a91279efcb61af39464 (patch)
tree5886f0c64434cbc9844109d0741e32fb24dcfb73
parent918d281ec34a8a20afd28c4185e2b2034a9ec7f5 (diff)
INTEGRATION: CWS fwk84_SRC680 (1.3.44); FILE MERGED
2008/01/29 09:38:01 as 1.3.44.4: #153305# wait till external programm was finished 2008/01/29 07:29:16 as 1.3.44.3: #153305# osl_executeProcess supports file URLs only 2008/01/28 10:20:32 as 1.3.44.2: #153305# check empty arguments list explicitely 2008/01/25 15:27:10 as 1.3.44.1: #153305, 153306# use osl_executeProcess instead of SystemShellExecute
-rw-r--r--framework/source/jobs/shelljob.cxx101
1 files changed, 38 insertions, 63 deletions
diff --git a/framework/source/jobs/shelljob.cxx b/framework/source/jobs/shelljob.cxx
index 2f3abde786c5..bbdf0a9f0ac3 100644
--- a/framework/source/jobs/shelljob.cxx
+++ b/framework/source/jobs/shelljob.cxx
@@ -4,9 +4,9 @@
*
* $RCSfile: shelljob.cxx,v $
*
- * $Revision: 1.3 $
+ * $Revision: 1.4 $
*
- * last change: $Author: hr $ $Date: 2007-11-02 12:54:22 $
+ * last change: $Author: vg $ $Date: 2008-02-12 17:25:05 $
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
@@ -48,6 +48,7 @@
// include others
#include <osl/file.hxx>
+#include <osl/process.h>
#include <vcl/svapp.hxx>
#include <rtl/ustrbuf.hxx>
#include <comphelper/sequenceashashmap.hxx>
@@ -76,27 +77,11 @@ static const ::rtl::OUString PROP_COMMAND = ::rtl::OUString::createFromAscii("Co
/** adress job configuration property "Arguments". */
static const ::rtl::OUString PROP_ARGUMENTS = ::rtl::OUString::createFromAscii("Arguments");
-/** adress job configuration property "NeedsSystemPathConversion". */
-static const ::rtl::OUString PROP_NEEDSSYSTEMPATHCONVERSION = ::rtl::OUString::createFromAscii("NeedsSystemPathConversion");
-
/** adress job configuration property "DeactivateJobIfDone". */
static const ::rtl::OUString PROP_DEACTIVATEJOBIFDONE = ::rtl::OUString::createFromAscii("DeactivateJobIfDone");
-/** special and magic number to make XSystemShellExecute working .-)
-
- The problem behind: SystemShellExecute is used inside SFX to open hyperlinks
- within a browser. But such URLs must be encoded ... otherwise they can be used
- differently by adding real shell commands at the end of the URL !
-
- On the other side real shell commands cant be used at the XSystemShellExecute
- so. Because a list of arguments will be handled as one single argument then.
-
- Solution: We must have two services differ between thos two use cases ...
- Workaround: XSystemShellExecute uses last parameter (long flags) ins special manner
- to know that the given command is realy a shell command and not an URL.
- And the answer to all questions is (as everytime) ... 42 :-))
-*/
-static const ::sal_Int32 ANSWER_TO_ALL_QUESTIONS = 42;
+/** adress job configuration property "CheckExitCode". */
+static const ::rtl::OUString PROP_CHECKEXITCODE = ::rtl::OUString::createFromAscii("CheckExitCode");
//-----------------------------------------------
@@ -139,35 +124,30 @@ ShellJob::~ShellJob()
}
//-----------------------------------------------
-css::uno::Any SAL_CALL ShellJob::execute(const css::uno::Sequence< css::beans::NamedValue >& lArguments)
+css::uno::Any SAL_CALL ShellJob::execute(const css::uno::Sequence< css::beans::NamedValue >& lJobArguments)
throw(css::lang::IllegalArgumentException,
css::uno::Exception ,
css::uno::RuntimeException )
{
- ::comphelper::SequenceAsHashMap lArgs (lArguments);
+ ::comphelper::SequenceAsHashMap lArgs (lJobArguments);
::comphelper::SequenceAsHashMap lOwnCfg(lArgs.getUnpackedValueOrDefault(PROP_JOBCONFIG, css::uno::Sequence< css::beans::NamedValue >()));
- ::rtl::OUString sCommand = lOwnCfg.getUnpackedValueOrDefault(PROP_COMMAND , ::rtl::OUString());
- ::rtl::OUString sArguments = lOwnCfg.getUnpackedValueOrDefault(PROP_ARGUMENTS , ::rtl::OUString());
- ::sal_Bool bNeedsSystemPathConversion = lOwnCfg.getUnpackedValueOrDefault(PROP_NEEDSSYSTEMPATHCONVERSION, sal_False );
- ::sal_Bool bDeactivateJobIfDone = lOwnCfg.getUnpackedValueOrDefault(PROP_DEACTIVATEJOBIFDONE , sal_True );
+ const ::rtl::OUString sCommand = lOwnCfg.getUnpackedValueOrDefault(PROP_COMMAND , ::rtl::OUString());
+ const css::uno::Sequence< ::rtl::OUString > lCommandArguments = lOwnCfg.getUnpackedValueOrDefault(PROP_ARGUMENTS , css::uno::Sequence< ::rtl::OUString >());
+ const ::sal_Bool bDeactivateJobIfDone = lOwnCfg.getUnpackedValueOrDefault(PROP_DEACTIVATEJOBIFDONE , sal_True );
+ const ::sal_Bool bCheckExitCode = lOwnCfg.getUnpackedValueOrDefault(PROP_CHECKEXITCODE , sal_True );
// replace all might existing place holder.
- ::rtl::OUString sCompleteCommand = impl_substituteCommandVariables(sCommand);
-
- // see if URL->system path conversion is needed.
- if (bNeedsSystemPathConversion)
- sCompleteCommand = impl_convertCommandURL2SystemPath(sCompleteCommand);
+ ::rtl::OUString sRealCommand = impl_substituteCommandVariables(sCommand);
// Command is required as minimum.
- // If it does not exists ... or conversion to system path failed
- // we cant do our job.
+ // If it does not exists ... we cant do our job.
// Deactivate such miss configured job silently .-)
- if (sCompleteCommand.getLength() < 1)
+ if (sRealCommand.getLength() < 1)
return ShellJob::impl_generateAnswer4Deactivation();
// do it
- ::sal_Bool bDone = impl_execute(sCompleteCommand, sArguments);
+ ::sal_Bool bDone = impl_execute(sRealCommand, lCommandArguments, bCheckExitCode);
if (! bDone)
return css::uno::Any();
@@ -215,41 +195,36 @@ css::uno::Any ShellJob::impl_generateAnswer4Deactivation()
}
//-----------------------------------------------
-::rtl::OUString ShellJob::impl_convertCommandURL2SystemPath(const ::rtl::OUString& sURL)
+::sal_Bool ShellJob::impl_execute(const ::rtl::OUString& sCommand ,
+ const css::uno::Sequence< ::rtl::OUString >& lArguments ,
+ ::sal_Bool bCheckExitCode)
{
- ::rtl::OUString sPath;
+ ::rtl_uString** pArgs = NULL;
+ const ::sal_Int32 nArgs = lArguments.getLength ();
+ oslProcessOption nOptions = osl_Process_WAIT;
+ oslProcess hProcess(0);
- if (::osl::FileBase::getSystemPathFromFileURL(sURL, sPath) == ::osl::FileBase::E_None)
- return sPath;
+ if (nArgs > 0)
+ pArgs = reinterpret_cast< ::rtl_uString** >(const_cast< ::rtl::OUString* >(lArguments.getConstArray()));
- return ::rtl::OUString();
-}
+ oslProcessError eError = osl_executeProcess(sCommand.pData, pArgs, nArgs, nOptions, NULL, NULL, NULL, 0, &hProcess);
-//-----------------------------------------------
-::sal_Bool ShellJob::impl_execute(const ::rtl::OUString& sCommand ,
- const ::rtl::OUString& sArguments)
-{
- // SYNCHRONIZED ->
- ReadGuard aReadLock(m_aLock);
- css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = m_xSMGR;
- aReadLock.unlock();
- // <- SYNCHRONIZED
+ // executable not found or couldnt be started
+ if (eError != osl_Process_E_None)
+ return sal_False;
- try
- {
- css::uno::Reference< css::system::XSystemShellExecute > xExecute(xSMGR->createInstance(SERVICENAME_SYSTEMSHELLEXECUTE), css::uno::UNO_QUERY_THROW);
-#ifdef UNX
- xExecute->execute(sCommand, sArguments, ANSWER_TO_ALL_QUESTIONS);
-#elif defined( WNT )
- xExecute->execute(sCommand, sArguments, css::system::SystemShellExecuteFlags::NO_SYSTEM_ERROR_MESSAGE);
-#endif
- }
- catch(const css::uno::Exception&)
- {
+ if (! bCheckExitCode)
+ return sal_True;
+
+ // check it's return codes ...
+ oslProcessInfo aInfo;
+ aInfo.Size = sizeof (oslProcessInfo);
+ eError = osl_getProcessInfo(hProcess, osl_Process_EXITCODE, &aInfo);
+
+ if (eError != osl_Process_E_None)
return sal_False;
- }
- return sal_True;
+ return (aInfo.Code == 0);
}
} // namespace framework