diff options
Diffstat (limited to 'desktop/source/deployment/misc/dp_misc.cxx')
-rw-r--r-- | desktop/source/deployment/misc/dp_misc.cxx | 643 |
1 files changed, 0 insertions, 643 deletions
diff --git a/desktop/source/deployment/misc/dp_misc.cxx b/desktop/source/deployment/misc/dp_misc.cxx deleted file mode 100644 index 5eca4324cf..0000000000 --- a/desktop/source/deployment/misc/dp_misc.cxx +++ /dev/null @@ -1,643 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_desktop.hxx" - - -#include "dp_misc.h" -#include "dp_version.hxx" -#include "dp_interact.h" -#include "rtl/uri.hxx" -#include "rtl/digest.h" -#include "rtl/random.h" -#include "rtl/bootstrap.hxx" -#include "unotools/bootstrap.hxx" -#include "osl/file.hxx" -#include "osl/pipe.hxx" -#include "osl/security.hxx" -#include "osl/thread.hxx" -#include "osl/mutex.hxx" -#include "com/sun/star/ucb/CommandAbortedException.hpp" -#include "com/sun/star/task/XInteractionHandler.hpp" -#include "com/sun/star/bridge/UnoUrlResolver.hpp" -#include "com/sun/star/bridge/XUnoUrlResolver.hpp" -#include "com/sun/star/deployment/ExtensionManager.hpp" -#include "com/sun/star/task/XRestartManager.hpp" -#include "boost/scoped_array.hpp" -#include "boost/shared_ptr.hpp" -#include <comphelper/processfactory.hxx> -#include <salhelper/linkhelper.hxx> - -#ifdef WNT -#define UNICODE -#define _UNICODE -#define WIN32_LEAN_AND_MEAN -#include <windows.h> -#endif - -using namespace ::com::sun::star; -using namespace ::com::sun::star::uno; -using ::rtl::OUString; -using ::rtl::OString; - - -#define SOFFICE1 "soffice.exe" -#define SOFFICE2 "soffice.bin" -#define SBASE "sbase.exe" -#define SCALC "scalc.exe" -#define SDRAW "sdraw.exe" -#define SIMPRESS "simpress.exe" -#define SWRITER "swriter.exe" - -namespace dp_misc { -namespace { - -struct UnoRc : public rtl::StaticWithInit< - boost::shared_ptr<rtl::Bootstrap>, UnoRc> { - const boost::shared_ptr<rtl::Bootstrap> operator () () { - OUString unorc( RTL_CONSTASCII_USTRINGPARAM( - "$OOO_BASE_DIR/program/" SAL_CONFIGFILE("uno")) ); - ::rtl::Bootstrap::expandMacros( unorc ); - ::boost::shared_ptr< ::rtl::Bootstrap > ret( - new ::rtl::Bootstrap( unorc ) ); - OSL_ASSERT( ret->getHandle() != 0 ); - return ret; - } -}; - -struct OfficePipeId : public rtl::StaticWithInit<OUString, OfficePipeId> { - const OUString operator () (); -}; - -const OUString OfficePipeId::operator () () -{ - OUString userPath; - ::utl::Bootstrap::PathStatus aLocateResult = - ::utl::Bootstrap::locateUserInstallation( userPath ); - if (!(aLocateResult == ::utl::Bootstrap::PATH_EXISTS || - aLocateResult == ::utl::Bootstrap::PATH_VALID)) - { - throw Exception(OUSTR("Extension Manager: Could not obtain path for UserInstallation."), 0); - } - - rtlDigest digest = rtl_digest_create( rtl_Digest_AlgorithmMD5 ); - if (digest <= 0) { - throw RuntimeException( - OUSTR("cannot get digest rtl_Digest_AlgorithmMD5!"), 0 ); - } - - sal_uInt8 const * data = - reinterpret_cast<sal_uInt8 const *>(userPath.getStr()); - sal_Size size = (userPath.getLength() * sizeof (sal_Unicode)); - sal_uInt32 md5_key_len = rtl_digest_queryLength( digest ); - ::boost::scoped_array<sal_uInt8> md5_buf( new sal_uInt8 [ md5_key_len ] ); - - rtl_digest_init( digest, data, static_cast<sal_uInt32>(size) ); - rtl_digest_update( digest, data, static_cast<sal_uInt32>(size) ); - rtl_digest_get( digest, md5_buf.get(), md5_key_len ); - rtl_digest_destroy( digest ); - - // create hex-value string from the MD5 value to keep - // the string size minimal - ::rtl::OUStringBuffer buf; - buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("SingleOfficeIPC_") ); - for ( sal_uInt32 i = 0; i < md5_key_len; ++i ) { - buf.append( static_cast<sal_Int32>(md5_buf[ i ]), 0x10 ); - } - return buf.makeStringAndClear(); -} - -bool existsOfficePipe() -{ - OUString const & pipeId = OfficePipeId::get(); - if (pipeId.getLength() == 0) - return false; - ::osl::Security sec; - ::osl::Pipe pipe( pipeId, osl_Pipe_OPEN, sec ); - return pipe.is(); -} - -//get modification time -static bool getModifyTimeTargetFile(const OUString &rFileURL, TimeValue &rTime) -{ - salhelper::LinkResolver aResolver(osl_FileStatus_Mask_ModifyTime); - - if (aResolver.fetchFileStatus(rFileURL) != osl::FileBase::E_None) - return false; - - rTime = aResolver.m_aStatus.getModifyTime(); - - return true; -} - -//Returns true if the Folder was more recently modified then -//the lastsynchronized file. That is the repository needs to -//be synchronized. -bool compareExtensionFolderWithLastSynchronizedFile( - OUString const & folderURL, OUString const & fileURL) -{ - bool bNeedsSync = false; - ::osl::DirectoryItem itemExtFolder; - ::osl::File::RC err1 = - ::osl::DirectoryItem::get(folderURL, itemExtFolder); - //If it does not exist, then there is nothing to be done - if (err1 == ::osl::File::E_NOENT) - { - return false; - } - else if (err1 != ::osl::File::E_None) - { - OSL_FAIL("Cannot access extension folder"); - return true; //sync just in case - } - - //If last synchronized does not exist, then OOo is started for the first time - ::osl::DirectoryItem itemFile; - ::osl::File::RC err2 = ::osl::DirectoryItem::get(fileURL, itemFile); - if (err2 == ::osl::File::E_NOENT) - { - return true; - - } - else if (err2 != ::osl::File::E_None) - { - OSL_FAIL("Cannot access file lastsynchronized"); - return true; //sync just in case - } - - //compare the modification time of the extension folder and the last - //modified file - TimeValue timeFolder; - if (getModifyTimeTargetFile(folderURL, timeFolder)) - { - TimeValue timeFile; - if (getModifyTimeTargetFile(fileURL, timeFile)) - { - if (timeFile.Seconds < timeFolder.Seconds) - bNeedsSync = true; - } - else - { - OSL_ASSERT(0); - bNeedsSync = true; - } - } - else - { - OSL_ASSERT(0); - bNeedsSync = true; - } - - return bNeedsSync; -} - -bool needToSyncRepostitory(OUString const & name) -{ - OUString folder; - OUString file; - if (name.equals(OUString(RTL_CONSTASCII_USTRINGPARAM("bundled")))) - { - folder = OUString( - RTL_CONSTASCII_USTRINGPARAM("$BUNDLED_EXTENSIONS")); - file = OUString ( - RTL_CONSTASCII_USTRINGPARAM( - "$BUNDLED_EXTENSIONS_USER/lastsynchronized")); - } - else if (name.equals(OUString(RTL_CONSTASCII_USTRINGPARAM("shared")))) - { - folder = OUString( - RTL_CONSTASCII_USTRINGPARAM( - "$UNO_SHARED_PACKAGES_CACHE/uno_packages")); - file = OUString ( - RTL_CONSTASCII_USTRINGPARAM( - "$SHARED_EXTENSIONS_USER/lastsynchronized")); - } - else - { - OSL_ASSERT(0); - return true; - } - ::rtl::Bootstrap::expandMacros(folder); - ::rtl::Bootstrap::expandMacros(file); - return compareExtensionFolderWithLastSynchronizedFile( - folder, file); -} - - -} // anon namespace - -//============================================================================== - -namespace { -inline OUString encodeForRcFile( OUString const & str ) -{ - // escape $\{} (=> rtl bootstrap files) - ::rtl::OUStringBuffer buf; - sal_Int32 pos = 0; - const sal_Int32 len = str.getLength(); - for ( ; pos < len; ++pos ) { - sal_Unicode c = str[ pos ]; - switch (c) { - case '$': - case '\\': - case '{': - case '}': - buf.append( static_cast<sal_Unicode>('\\') ); - break; - } - buf.append( c ); - } - return buf.makeStringAndClear(); -} -} - -//============================================================================== -OUString makeURL( OUString const & baseURL, OUString const & relPath_ ) -{ - ::rtl::OUStringBuffer buf; - if (baseURL.getLength() > 1 && baseURL[ baseURL.getLength() - 1 ] == '/') - buf.append( baseURL.copy( 0, baseURL.getLength() - 1 ) ); - else - buf.append( baseURL ); - OUString relPath(relPath_); - if (relPath.getLength() > 0 && relPath[ 0 ] == '/') - relPath = relPath.copy( 1 ); - if (relPath.getLength() > 0) - { - buf.append( static_cast<sal_Unicode>('/') ); - if (baseURL.matchAsciiL( - RTL_CONSTASCII_STRINGPARAM("vnd.sun.star.expand:") )) { - // encode for macro expansion: relPath is supposed to have no - // macros, so encode $, {} \ (bootstrap mimic) - relPath = encodeForRcFile(relPath); - - // encode once more for vnd.sun.star.expand schema: - // vnd.sun.star.expand:$UNO_... - // will expand to file-url - relPath = ::rtl::Uri::encode( relPath, rtl_UriCharClassUric, - rtl_UriEncodeIgnoreEscapes, - RTL_TEXTENCODING_UTF8 ); - } - buf.append( relPath ); - } - return buf.makeStringAndClear(); -} - -OUString makeURLAppendSysPathSegment( OUString const & baseURL, OUString const & relPath_ ) -{ - OUString segment = relPath_; - OSL_ASSERT(segment.indexOf(static_cast<sal_Unicode>('/')) == -1); - - ::rtl::Uri::encode( - segment, rtl_UriCharClassPchar, rtl_UriEncodeIgnoreEscapes, - RTL_TEXTENCODING_UTF8); - return makeURL(baseURL, segment); -} - - - -//============================================================================== -OUString expandUnoRcTerm( OUString const & term_ ) -{ - OUString term(term_); - UnoRc::get()->expandMacrosFrom( term ); - return term; -} - -OUString makeRcTerm( OUString const & url ) -{ - OSL_ASSERT( url.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( - "vnd.sun.star.expand:") ) ); - if (url.matchAsciiL( RTL_CONSTASCII_STRINGPARAM("vnd.sun.star.expand:") )) { - // cut protocol: - OUString rcterm( url.copy( sizeof ("vnd.sun.star.expand:") - 1 ) ); - // decode uric class chars: - rcterm = ::rtl::Uri::decode( - rcterm, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8 ); - return rcterm; - } - else - return url; -} - -//============================================================================== -OUString expandUnoRcUrl( OUString const & url ) -{ - if (url.matchAsciiL( RTL_CONSTASCII_STRINGPARAM("vnd.sun.star.expand:") )) { - // cut protocol: - OUString rcurl( url.copy( sizeof ("vnd.sun.star.expand:") - 1 ) ); - // decode uric class chars: - rcurl = ::rtl::Uri::decode( - rcurl, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8 ); - // expand macro string: - UnoRc::get()->expandMacrosFrom( rcurl ); - return rcurl; - } - else { - return url; - } -} - -//============================================================================== -bool office_is_running() -{ - //We need to check if we run within the office process. Then we must not use the pipe, because - //this could cause a deadlock. This is actually a workaround for i82778 - OUString sFile; - oslProcessError err = osl_getExecutableFile(& sFile.pData); - bool ret = false; - if (osl_Process_E_None == err) - { - sFile = sFile.copy(sFile.lastIndexOf('/') + 1); - if ( -#if defined UNIX - sFile.equals(OUString(RTL_CONSTASCII_USTRINGPARAM(SOFFICE2))) -#elif defined WNT - //osl_getExecutableFile should deliver "soffice.bin" on windows - //even if swriter.exe, scalc.exe etc. was started. This is a bug - //in osl_getExecutableFile - sFile.equals(OUString(RTL_CONSTASCII_USTRINGPARAM(SOFFICE1))) - || sFile.equals(OUString(RTL_CONSTASCII_USTRINGPARAM(SOFFICE2))) - || sFile.equals(OUString(RTL_CONSTASCII_USTRINGPARAM(SBASE))) - || sFile.equals(OUString(RTL_CONSTASCII_USTRINGPARAM(SCALC))) - || sFile.equals(OUString(RTL_CONSTASCII_USTRINGPARAM(SDRAW))) - || sFile.equals(OUString(RTL_CONSTASCII_USTRINGPARAM(SIMPRESS))) - || sFile.equals(OUString(RTL_CONSTASCII_USTRINGPARAM(SWRITER))) -#else -#error "Unsupported platform" -#endif - - ) - ret = true; - else - ret = existsOfficePipe(); - } - else - { - OSL_FAIL("NOT osl_Process_E_None "); - //if osl_getExecutable file than we take the risk of creating a pipe - ret = existsOfficePipe(); - } - return ret; -} - -//============================================================================== -oslProcess raiseProcess( - OUString const & appURL, Sequence<OUString> const & args ) -{ - ::osl::Security sec; - oslProcess hProcess = 0; - oslProcessError rc = osl_executeProcess( - appURL.pData, - reinterpret_cast<rtl_uString **>( - const_cast<OUString *>(args.getConstArray()) ), - args.getLength(), - osl_Process_DETACHED, - sec.getHandle(), - 0, // => current working dir - 0, 0, // => no env vars - &hProcess ); - - switch (rc) { - case osl_Process_E_None: - break; - case osl_Process_E_NotFound: - throw RuntimeException( OUSTR("image not found!"), 0 ); - case osl_Process_E_TimedOut: - throw RuntimeException( OUSTR("timout occurred!"), 0 ); - case osl_Process_E_NoPermission: - throw RuntimeException( OUSTR("permission denied!"), 0 ); - case osl_Process_E_Unknown: - throw RuntimeException( OUSTR("unknown error!"), 0 ); - case osl_Process_E_InvalidError: - default: - throw RuntimeException( OUSTR("unmapped error!"), 0 ); - } - - return hProcess; -} - -//============================================================================== -OUString generateRandomPipeId() -{ - // compute some good pipe id: - static rtlRandomPool s_hPool = rtl_random_createPool(); - if (s_hPool == 0) - throw RuntimeException( OUSTR("cannot create random pool!?"), 0 ); - sal_uInt8 bytes[ 32 ]; - if (rtl_random_getBytes( - s_hPool, bytes, ARLEN(bytes) ) != rtl_Random_E_None) { - throw RuntimeException( OUSTR("random pool error!?"), 0 ); - } - ::rtl::OUStringBuffer buf; - for ( sal_uInt32 i = 0; i < ARLEN(bytes); ++i ) { - buf.append( static_cast<sal_Int32>(bytes[ i ]), 0x10 ); - } - return buf.makeStringAndClear(); -} - -//============================================================================== -Reference<XInterface> resolveUnoURL( - OUString const & connectString, - Reference<XComponentContext> const & xLocalContext, - AbortChannel * abortChannel ) -{ - Reference<bridge::XUnoUrlResolver> xUnoUrlResolver( - bridge::UnoUrlResolver::create( xLocalContext ) ); - - for (;;) - { - if (abortChannel != 0 && abortChannel->isAborted()) { - throw ucb::CommandAbortedException( - OUSTR("abort!"), Reference<XInterface>() ); - } - try { - return xUnoUrlResolver->resolve( connectString ); - } - catch (connection::NoConnectException &) { - TimeValue tv = { 0 /* secs */, 500000000 /* nanosecs */ }; - ::osl::Thread::wait( tv ); - } - } -} - -#ifdef WNT -void writeConsoleWithStream(::rtl::OUString const & sText, HANDLE stream) -{ - DWORD nWrittenChars = 0; - WriteFile(stream, sText.getStr(), - sText.getLength() * 2, &nWrittenChars, NULL); -} -#else -void writeConsoleWithStream(::rtl::OUString const & sText, FILE * stream) -{ - OString s = OUStringToOString(sText, osl_getThreadTextEncoding()); - fprintf(stream, "%s", s.getStr()); - fflush(stream); -} -#endif - -#ifdef WNT -void writeConsoleWithStream(::rtl::OString const & sText, HANDLE stream) -{ - writeConsoleWithStream(OStringToOUString( - sText, RTL_TEXTENCODING_UTF8), stream); -} -#else -void writeConsoleWithStream(::rtl::OString const & sText, FILE * stream) -{ - fprintf(stream, "%s", sText.getStr()); - fflush(stream); -} -#endif - -void writeConsole(::rtl::OUString const & sText) -{ -#ifdef WNT - writeConsoleWithStream(sText, GetStdHandle(STD_OUTPUT_HANDLE)); -#else - writeConsoleWithStream(sText, stdout); -#endif -} - -void writeConsole(::rtl::OString const & sText) -{ -#ifdef WNT - writeConsoleWithStream(sText, GetStdHandle(STD_OUTPUT_HANDLE)); -#else - writeConsoleWithStream(sText, stdout); -#endif -} - -void writeConsoleError(::rtl::OUString const & sText) -{ -#ifdef WNT - writeConsoleWithStream(sText, GetStdHandle(STD_ERROR_HANDLE)); -#else - writeConsoleWithStream(sText, stderr); -#endif -} - - -void writeConsoleError(::rtl::OString const & sText) -{ -#ifdef WNT - writeConsoleWithStream(sText, GetStdHandle(STD_ERROR_HANDLE)); -#else - writeConsoleWithStream(sText, stderr); -#endif -} - - - -OUString readConsole() -{ -#ifdef WNT - sal_Unicode aBuffer[1024]; - DWORD dwRead = 0; - //unopkg.com feeds unopkg.exe with wchar_t|s - if (ReadFile( GetStdHandle(STD_INPUT_HANDLE), &aBuffer, sizeof(aBuffer), &dwRead, NULL ) ) - { - OSL_ASSERT((dwRead % 2) == 0); - OUString value( aBuffer, dwRead / 2); - return value.trim(); - } -#else - char buf[1024]; - rtl_zeroMemory(buf, 1024); - // read one char less so that the last char in buf is always zero - if (fgets(buf, 1024, stdin) != NULL) - { - OUString value = ::rtl::OStringToOUString(::rtl::OString(buf), osl_getThreadTextEncoding()); - return value.trim(); - } -#endif - return OUString(); -} - -void TRACE(::rtl::OUString const & sText) -{ - (void) sText; -#if OSL_DEBUG_LEVEL > 1 - writeConsole(sText); -#endif -} - -void TRACE(::rtl::OString const & sText) -{ - (void) sText; -#if OSL_DEBUG_LEVEL > 1 - writeConsole(sText); -#endif -} - -void syncRepositories(Reference<ucb::XCommandEnvironment> const & xCmdEnv) -{ - OUString sDisable; - ::rtl::Bootstrap::get( OUSTR( "DISABLE_EXTENSION_SYNCHRONIZATION" ), sDisable, OUString() ); - if (sDisable.getLength() > 0) - return; - - Reference<deployment::XExtensionManager> xExtensionManager; - //synchronize shared before bundled otherewise there are - //more revoke and registration calls. - sal_Bool bModified = false; - if (needToSyncRepostitory(OUString(RTL_CONSTASCII_USTRINGPARAM("shared"))) - || needToSyncRepostitory(OUString(RTL_CONSTASCII_USTRINGPARAM("bundled")))) - { - xExtensionManager = - deployment::ExtensionManager::get( - comphelper_getProcessComponentContext()); - - if (xExtensionManager.is()) - { - bModified = xExtensionManager->synchronize( - Reference<task::XAbortChannel>(), xCmdEnv); - } - } - - if (bModified) - { - Reference<task::XRestartManager> restarter( - comphelper_getProcessComponentContext()->getValueByName( - OUSTR( "/singletons/com.sun.star.task.OfficeRestartManager") ), UNO_QUERY ); - if (restarter.is()) - { - OSL_TRACE( "Request restart for modified extensions manager" ); - restarter->requestRestart(xCmdEnv.is() == sal_True ? xCmdEnv->getInteractionHandler() : - Reference<task::XInteractionHandler>()); - } - } -} - - - -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |