Tag: cws_src680_dba20c User: fs Date: 05/05/17 06:02:18 Modified: /dba/connectivity/source/drivers/evoab/ LDriver.cxx
Log: #122864# osl_executeProcess_WithRedirectIO calls without WAIT-flag, but subsequent 'osl_joinProcess' calls - somehow, the function didn't return when WAIT was specified (which is a separate bug) File Changes: Directory: /dba/connectivity/source/drivers/evoab/ ================================================== File [changed]: LDriver.cxx Url: http://dba.openoffice.org/source/browse/dba/connectivity/source/drivers/evoab/LDriver.cxx?r1=1.3&r2=1.3.96.1 Delta lines: +117 -106 ----------------------- --- LDriver.cxx 2 Aug 2004 17:01:28 -0000 1.3 +++ LDriver.cxx 17 May 2005 13:02:14 -0000 1.3.96.1 @@ -2,9 +2,9 @@ * * $RCSfile: LDriver.cxx,v $ * - * $Revision: 1.3 $ + * $Revision: 1.3.96.1 $ * - * last change: $Author: hr $ $Date: 2004/08/02 17:01:28 $ + * last change: $Author: fs $ $Date: 2005/05/17 13:02:14 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -116,6 +116,7 @@ ,m_aFolderListName(::rtl::OUString::createFromAscii(getEVOAB_FOLDERLIST_FILE_NAME())) ,m_aVersionName(::rtl::OUString::createFromAscii(getEVOAB_VERSION_FILE_NAME())) ,m_aFileExt(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(getEVOAB_META_FILE_EXT()))) + ,m_eSupportedEvoVersion( eUnknown ) { m_aEvoab_CLI_FullPathCommand = getFullPathExportingCommand(_rxFactory); @@ -126,7 +127,7 @@ m_aEvoab_CLI_EffectiveCommand = m_aEvoab_CLI_FullPathCommand; m_aTempDir.EnableKillingFile(); - EVO_TRACE_STRING("OEvoabDriver::OEvoabDriver()::m_aEvoab_CLI_FullPathCommand = %s\n", m_aEvoab_CLI_FullPathCommand ); + EVO_TRACE_STRING("OEvoabDriver::OEvoabDriver()::m_aEvoab_CLI_FullPathCommand = %s", m_aEvoab_CLI_FullPathCommand ); } // static ServiceInfo //------------------------------------------------------------------------------ @@ -164,6 +165,81 @@ return xCon; } // -------------------------------------------------------------------------------- +namespace +{ + ::rtl::OUString lcl_translateProcessErrorMessage( oslProcessError nProcErr) + { + ::rtl::OUString sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" not executed!.")); + switch (nProcErr) + { + case osl_Process_E_None: + sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed sucessful!")); + break; + case osl_Process_E_NotFound: + sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed failed: not found!")); + break; + case osl_Process_E_NoPermission: + sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed failed: has no permission!")); + break; + case osl_Process_E_TimedOut: + sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed failed: time out!")); + break; + case osl_Process_E_Unknown: + sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed failed: unkown reason!")); + break; + case osl_Process_E_InvalidError: + sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed failed: invalid error!")); + break; + default: + sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed failed: other reason!")); + } + return sProcErr; + } + oslProcessError lcl_execute( const ::rtl::OUString& _rCommand, const ::rtl::OUString& _rArgument, + const ::rtl::OUString& _rWorkingDir, oslProcessOption _nOptions, oslFileHandle& /*[out]*/ _hStdOut ) + { + oslProcessError nError = osl_Process_E_None; + + EVO_TRACE_STRING("LDriver.cxx::lcl_execute: command : %s", _rCommand ); + EVO_TRACE_STRING("LDriver.cxx::lcl_execute: argument : %s", _rArgument ); + EVO_TRACE_STRING("LDriver.cxx::lcl_execute: working dir: %s", _rWorkingDir ); + + oslProcess hProcess( 0 ); + + nError = osl_executeProcess_WithRedirectedIO( + _rCommand.pData, + &_rArgument.pData, + 1, + _nOptions, + 0, + _rWorkingDir.pData, + 0, + 0, + &hProcess, + NULL, + &_hStdOut, + NULL + ); + ::rtl::OUString sError = _rCommand + lcl_translateProcessErrorMessage( nError); + EVO_TRACE_STRING( "%s", sError ); + + if ( nError == osl_Process_E_None ) + { + TimeValue aFiveSeconds; + aFiveSeconds.Seconds = 5; + aFiveSeconds.Nanosec = 0; + oslProcessError nWaitForProcessError = osl_joinProcessWithTimeout( hProcess, &aFiveSeconds ); + if ( osl_Process_E_None != nWaitForProcessError ) + { + nError = nWaitForProcessError; + // TODO: kill the running process? + } + } + return nError; + } +} + +// -------------------------------------------------------------------------------- sal_Bool SAL_CALL OEvoabDriver::acceptsURL( const ::rtl::OUString& url ) throw(SQLException, RuntimeException) { @@ -172,10 +248,13 @@ // here we have to look if we support this url format if(acceptsURL_Stat(url)) { + if ( m_eSupportedEvoVersion != eUnknown ) + return m_eSupportedEvoVersion == eTrue ? sal_True : sal_False; + if(!m_bWorkingDirCreated) { String sTempDirURL = getTempDirURL(); - //EVO_TRACE_STRING("OEvoabDriver::acceptsURL()::sTempDirURL = %s\n", sTempDirURL ); + //EVO_TRACE_STRING("OEvoabDriver::acceptsURL()::sTempDirURL = %s", sTempDirURL ); ::rtl::OUString aTempDirURL(sTempDirURL); m_aWorkingDirURL = aTempDirURL; @@ -185,73 +264,31 @@ ::rtl::OUString aCLICommand = getEvoab_CLI_EffectiveCommand(); ::rtl::OUString aWorkingDirURL = getWorkingDirURL(); ::rtl::OUString aArgVersion = ::rtl::OUString::createFromAscii(getEVOAB_CLI_ARG_VERSION()); - EVO_TRACE_STRING("OEvoabDriver::acceptsURL()::aCLICommand = %s\n", aCLICommand ); - EVO_TRACE_STRING("OEvoabDriver::acceptsURL()::aWorkingDirURL = %s\n", aWorkingDirURL ); - EVO_TRACE_STRING("OEvoabDriver::acceptsURL()::aArgVersion = %s\n", aArgVersion ); - //::rtl::OUString aVerFileName = getEvoVersionFileName(); - //::rtl::OUString aFullFileName = getWorkingDirURL() + aVerFileName; - //EVO_TRACE_STRING("OEvoabDriver::acceptsURL()::aVerFileName = %s\n", aVerFileName ); - - oslFileHandle aStdout = NULL; - - sal_Bool bSuccess; - bSuccess = sal_False; - oslProcess aProcess( 0 ); - oslProcessError nProcErr = osl_Process_E_None; - ::rtl::OUString sErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" no.error!")); - nProcErr = osl_executeProcess_WithRedirectedIO(aCLICommand.pData, - &aArgVersion.pData, - 1, - //osl_Process_SEARCHPATH - osl_Process_WAIT, - //| osl_Process_HIDDEN, - //osl::Security().getHandle(), - 0, - aWorkingDirURL.pData, - 0, - 0, - &aProcess, - NULL, - &aStdout, - NULL); - sErr = aCLICommand + translateProcessErrorMessage( nProcErr); - EVO_TRACE_STRING("%s \n", sErr); + + oslFileHandle hStdout = NULL; + oslProcessError nProcErr = lcl_execute( aCLICommand, aArgVersion, aWorkingDirURL, 0, hStdout ); if(nProcErr != osl_Process_E_None) { if(doesEvoab_CLI_HavePath()) aCLICommand = getEvoab_CLI_Command(); else aCLICommand = getEvoab_CLI_Path() + getEvoab_CLI_Command(); - EVO_TRACE_STRING("OEvoabDriver::acceptsURL()::aCLICommand = %s\n", aCLICommand ); - - nProcErr = osl_executeProcess_WithRedirectedIO(aCLICommand.pData, - &aArgVersion.pData, - 1, - osl_Process_SEARCHPATH | osl_Process_WAIT | osl_Process_HIDDEN, - 0 , - aWorkingDirURL.pData, - 0, - 0, - &aProcess, - NULL, - &aStdout, - NULL); + nProcErr = lcl_execute( aCLICommand, aArgVersion, aWorkingDirURL, osl_Process_SEARCHPATH | osl_Process_HIDDEN, hStdout ); if ( nProcErr == osl_Process_E_None ) m_aEvoab_CLI_EffectiveCommand = aCLICommand; - sErr = aCLICommand + translateProcessErrorMessage( nProcErr); - EVO_TRACE_STRING("%s \n", sErr); } - if(nProcErr == osl_Process_E_None) + + if ( hStdout != NULL ) { - OSL_ASSERT( aStdout ); + OSL_ASSERT( hStdout ); sal_Char pBuffer[256]; sal_uInt64 nBytesRead; OSL_ASSERT( pBuffer ); oslFileError nFileErr = osl_File_E_None; - nFileErr = osl_readFile( aStdout, pBuffer, 256, &nBytesRead); + nFileErr = osl_readFile( hStdout, pBuffer, 256, &nBytesRead); if ( nFileErr != osl_File_E_None ) { - sErr = translateFileErrorMessage( nFileErr); + ::rtl::OUString sErr = translateFileErrorMessage( nFileErr); OSL_ENSURE(false, ::rtl::OUStringToOString( sErr, RTL_TEXTENCODING_ASCII_US ).getStr()); } ::rtl::OUString aVersionInfo; @@ -262,7 +299,7 @@ ::rtl::OUString( ( sal_Char * )pBuffer, nBytesRead, RTL_TEXTENCODING_UTF8 ); - EVO_TRACE_STRING("OEvoabDriver::acceptsURL()::aVersionInfo = %s\n", aVersionInfo ); + EVO_TRACE_STRING("OEvoabDriver::acceptsURL()::aVersionInfo = %s", aVersionInfo ); sal_Int32 nIndex = 0; sal_Bool bNumRetrieved = sal_False; ::rtl::OUString aToken; @@ -274,7 +311,7 @@ { aToken = aVersionInfo.getToken( 0, ' ', nIndex ); //OSL_TRACE("OEvoabDriver::acceptsURL()::Token:%d", nIndex ); - //EVO_TRACE_STRING("OEvoabDriver::acceptsURL()::aToken = %s\n", aToken ); + //EVO_TRACE_STRING("OEvoabDriver::acceptsURL()::aToken = %s", aToken ); if( aToken.toChar() >= '0' && aToken.toChar() <= '9' ) { bNumRetrieved = sal_True; @@ -300,10 +337,12 @@ } else bRet = sal_False; + + osl_closeFile( hStdout ); } - osl_closeFile( aStdout ); + m_eSupportedEvoVersion = bRet ? eTrue : eFalse; } - EVO_TRACE_STRING("OEvoabDriver::acceptsURL()::return, return value = %s\n", ::rtl::OUString::valueOf(bRet) ); + EVO_TRACE_STRING("OEvoabDriver::acceptsURL()::return, return value = %s", ::rtl::OUString::valueOf(bRet) ); return bRet; } @@ -312,7 +351,7 @@ sal_Bool OEvoabDriver::acceptsURL_Stat( const ::rtl::OUString& url ) { - EVO_TRACE_STRING("OEvoabDriver::acceptsURL_Stat()::Scheme = %s\n", url ); + EVO_TRACE_STRING("OEvoabDriver::acceptsURL_Stat()::Scheme = %s", url ); // Skip 'sdbc:address: part of URL // sal_Int32 nLen = url.indexOf(':'); @@ -336,8 +375,8 @@ aAddrbookScheme = aAddrbookURI.copy(0, nLen); - EVO_TRACE_STRING("OEvoabDriver::acceptsURL_Stat()::URI = %s\n", aAddrbookURI ); - EVO_TRACE_STRING("OEvoabDriver::acceptsURL_Stat()::Scheme = %s\n", aAddrbookScheme ); + EVO_TRACE_STRING("OEvoabDriver::acceptsURL_Stat()::URI = %s", aAddrbookURI ); + EVO_TRACE_STRING("OEvoabDriver::acceptsURL_Stat()::Scheme = %s", aAddrbookScheme ); return aAddrbookScheme.compareToAscii( getSDBC_SCHEME_EVOLUTION() ) == 0 ; } @@ -352,7 +391,7 @@ else aEvoab_CLI_Command = m_aEvoab_CLI_FullPathCommand.copy(nLen+1); - EVO_TRACE_STRING( "OEvoabDriver::getEvoab_CLI_Command()::aEvoab_CLI_Command = %s\n", aEvoab_CLI_Command ); + EVO_TRACE_STRING( "OEvoabDriver::getEvoab_CLI_Command()::aEvoab_CLI_Command = %s", aEvoab_CLI_Command ); return aEvoab_CLI_Command; } @@ -371,7 +410,7 @@ } else aEvoab_CLI_Path = m_aEvoab_CLI_FullPathCommand.copy(0, nLen+1); - EVO_TRACE_STRING( "OEvoabDriver::getEvoab_CLI_Path()::aEvoab_CLI_Path = %s\n", aEvoab_CLI_Path ); + EVO_TRACE_STRING( "OEvoabDriver::getEvoab_CLI_Path()::aEvoab_CLI_Path = %s", aEvoab_CLI_Path ); return aEvoab_CLI_Path; } @@ -390,7 +429,7 @@ ::rtl::OUString aEvoFolderListFileURL; aEvoFolderListFileURL = getWorkingDirURL() + getEvoFolderListFileName(); - EVO_TRACE_STRING("OEvoabDriver::getEvoFolderListFileURL(): aEvoFolderListFileURL = %s\n", aEvoFolderListFileURL ); + EVO_TRACE_STRING("OEvoabDriver::getEvoFolderListFileURL(): aEvoFolderListFileURL = %s", aEvoFolderListFileURL ); return aEvoFolderListFileURL.getStr(); } @@ -402,7 +441,7 @@ if((aTempDirURL.lastIndexOf( '/')) != (aTempDirURL.getLength( ) - 1)) aTempDirURL += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")); - EVO_TRACE_STRING("OEvoabDriver::getTempDirURL(): aTempDirURL = %s\n", aTempDirURL ); + EVO_TRACE_STRING("OEvoabDriver::getTempDirURL(): aTempDirURL = %s", aTempDirURL ); return aTempDirURL.getStr(); } //------------------------------------------------------------------------- @@ -472,34 +511,6 @@ { static sal_Char* EVOAB_CLI_ARG_OUTPUT_REDIRECT = ">"; return EVOAB_CLI_ARG_OUTPUT_REDIRECT; -} -rtl::OUString OEvoabDriver::translateProcessErrorMessage( oslProcessError nProcErr) -{ - ::rtl::OUString sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" not executed!.")); - switch (nProcErr) - { - case osl_Process_E_None: - sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed sucessful!")); - break; - case osl_Process_E_NotFound: - sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed failed: not found!")); - break; - case osl_Process_E_NoPermission: - sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed failed: has no permission!")); - break; - case osl_Process_E_TimedOut: - sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed failed: time out!")); - break; - case osl_Process_E_Unknown: - sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed failed: unkown reason!")); - break; - case osl_Process_E_InvalidError: - sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed failed: invalid error!")); - break; - default: - sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed failed: other reason!")); - } - return sProcErr; } rtl::OUString OEvoabDriver::translateFileErrorMessage( oslFileError nFileErr) { --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
