/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ #include #include #include #include #include #include "cmdmailsuppl.hxx" #include "cmdmailmsg.hxx" #include #include #include #include #include #include #include #include #include #include using com::sun::star::beans::PropertyValue; using com::sun::star::system::XSimpleMailClientSupplier; using com::sun::star::system::XSimpleMailClient; using com::sun::star::system::XSimpleMailMessage; using com::sun::star::system::XSimpleMailMessage2; using com::sun::star::container::XNameAccess; using osl::FileBase; using namespace cppu; using namespace com::sun::star::system::SimpleMailClientFlags; using namespace com::sun::star::uno; using namespace com::sun::star::lang; using namespace com::sun::star::configuration; namespace { Sequence< OUString > Component_getSupportedServiceNames() { Sequence< OUString > aRet { "com.sun.star.system.SimpleCommandMail" }; return aRet; } } CmdMailSuppl::CmdMailSuppl( const Reference< XComponentContext >& xContext ) : WeakImplHelper< XSimpleMailClientSupplier, XSimpleMailClient, XServiceInfo >() { m_xConfigurationProvider = theDefaultProvider::get(xContext); } // XSimpleMailClientSupplier Reference< XSimpleMailClient > SAL_CALL CmdMailSuppl::querySimpleMailClient( ) { return static_cast < XSimpleMailClient * > (this); } // XSimpleMailClient Reference< XSimpleMailMessage > SAL_CALL CmdMailSuppl::createSimpleMailMessage( ) { return Reference< XSimpleMailMessage >( new CmdMailMsg( ) ); } namespace { void appendShellWord(OStringBuffer & buffer, OUString const & word, bool strict) { OString sys; if (!word.convertToString( &sys, osl_getThreadTextEncoding(), (strict ? (RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR) : OUSTRING_TO_OSTRING_CVTFLAGS))) { throw css::uno::Exception( ("Could not convert \"" + word + "\" to encoding #" + OUString::number(osl_getThreadTextEncoding())), css::uno::Reference()); } buffer.append('\''); for (sal_Int32 i = 0; i != sys.getLength(); ++i) { char c = sys[i]; switch (c) { case 0: if (strict) { throw css::uno::Exception( "Could not convert word containing NUL, \"" + word + "\"", css::uno::Reference()); } break; case '\'': buffer.append("'\\''"); break; default: buffer.append(c); break; } } buffer.append('\''); } } void SAL_CALL CmdMailSuppl::sendSimpleMailMessage( const Reference< XSimpleMailMessage >& xSimpleMailMessage, sal_Int32 /*aFlag*/ ) { if ( ! xSimpleMailMessage.is() ) { throw css::lang::IllegalArgumentException( "No message specified" , static_cast < XSimpleMailClient * > (this), 1 ); } if( ! m_xConfigurationProvider.is() ) { throw css::uno::Exception( "Can not access configuration" , static_cast < XSimpleMailClient * > (this) ); } OUString aProgramURL("$BRAND_BASE_DIR/" LIBO_LIBEXEC_FOLDER "/senddoc"); rtl::Bootstrap::expandMacros(aProgramURL); OUString aProgram; if ( FileBase::E_None != FileBase::getSystemPathFromFileURL(aProgramURL, aProgram)) { throw css::uno::Exception("Could not convert executable path", static_cast < XSimpleMailClient * > (this)); } OStringBuffer aBuffer; appendShellWord(aBuffer, aProgram, true); try { // Query XNameAccess interface of the org.openoffice.Office.Common/ExternalMailer // configuration node to retrieve the users preferred email application. This may // transparently by redirected to e.g. the corresponding GConf setting in GNOME. OUString aConfigRoot = "org.openoffice.Office.Common/ExternalMailer"; PropertyValue aProperty; aProperty.Name = "nodepath"; aProperty.Value <<= aConfigRoot; Sequence< Any > aArgumentList( 1 ); aArgumentList[0] <<= aProperty; Reference< XNameAccess > xNameAccess = Reference< XNameAccess > ( m_xConfigurationProvider->createInstanceWithArguments( "com.sun.star.configuration.ConfigurationAccess", aArgumentList ), UNO_QUERY ); if( xNameAccess.is() ) { OUString aMailer; // Retrieve the value for "Program" node and append it feed senddoc with it // using the (undocumented) --mailclient switch xNameAccess->getByName("Program") >>= aMailer; if( !aMailer.isEmpty() ) { // make sure we have a system path FileBase::getSystemPathFromFileURL( aMailer, aMailer ); aBuffer.append(" --mailclient "); appendShellWord(aBuffer, aMailer, true); } #ifdef MACOSX else aBuffer.append(" --mailclient Mail"); #endif } } catch(const RuntimeException &e ) { m_xConfigurationProvider.clear(); SAL_WARN("shell", "RuntimeException caught accessing configuration provider. " << e ); throw; } Reference< XSimpleMailMessage2 > xMessage( xSimpleMailMessage, UNO_QUERY ); if ( xMessage.is() ) { rtl::OUString sBody = xMessage->getBody(); if ( sBody.getLength() > 0 ) { aBuffer.append(" --body "); appendShellWord(aBuffer, sBody, false); } } // Convert from, to, etc. in a best-effort rather than a strict way to the // system encoding, based on the assumption that the relevant address parts // of those strings are ASCII anyway and any problematic characters are only // in the human-readable, informational-only parts: // Append originator if set in the message if ( !xSimpleMailMessage->getOriginator().isEmpty() ) { aBuffer.append(" --from "); appendShellWord(aBuffer, xSimpleMailMessage->getOriginator(), false); } // Append recipient if set in the message if ( !xSimpleMailMessage->getRecipient().isEmpty() ) { aBuffer.append(" --to "); appendShellWord(aBuffer, xSimpleMailMessage->getRecipient(), false); } // Append carbon copy recipients set in the message Sequence< OUString > aStringList = xSimpleMailMessage->getCcRecipient(); sal_Int32 n, nmax = aStringList.getLength(); for ( n = 0; n < nmax; n++ ) { aBuffer.append(" --cc "); appendShellWord(aBuffer, aStringList[n], false); } // Append blind carbon copy recipients set in the message aStringList = xSimpleMailMessage->getBccRecipient(); nmax = aStringList.getLength(); for ( n = 0; n < nmax; n++ ) { aBuffer.append(" --bcc "); appendShellWord(aBuffer, aStringList[n], false); } // Append subject if set in the message if ( !xSimpleMailMessage->getSubject().isEmpty() ) { aBuffer.append(" --subject "); appendShellWord(aBuffer, xSimpleMailMessage->getSubject(), false); } // Append attachments set in the message aStringList = xSimpleMailMessage->getAttachement(); nmax = aStringList.getLength(); for ( n = 0; n < nmax; n++ ) { OUString aSystemPath; if ( FileBase::E_None == FileBase::getSystemPathFromFileURL(aStringList[n], aSystemPath) ) { aBuffer.append(" --attach "); appendShellWord(aBuffer, aSystemPath, true); } } OString cmd = aBuffer.makeStringAndClear(); FILE * f = popen(cmd.getStr(), "w"); if (f == nullptr || pclose(f) != 0) { throw css::uno::Exception("No mail client configured", static_cast < XSimpleMailClient * > (this) ); } } // XServiceInfo OUString SAL_CALL CmdMailSuppl::getImplementationName( ) { return OUString("com.sun.star.comp.system.SimpleCommandMail"); } sal_Bool SAL_CALL CmdMailSuppl::supportsService( const OUString& ServiceName ) { return cppu::supportsService(this, ServiceName); } Sequence< OUString > SAL_CALL CmdMailSuppl::getSupportedServiceNames( ) { return Component_getSupportedServiceNames(); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /RotGrfFlyFrame'>feature/RotGrfFlyFrame LibreOffice 核心代码仓库文档基金会
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2017-08-09 16:04:48 +0200
committerStephan Bergmann <sbergman@redhat.com>2017-08-09 16:15:19 +0200
commitfb899f976d2d8f15ca992ecb61511a2c83153c33 (patch)
tree2d405b292d64d69f239f8b23824e587ede47ecfc /external/libepubgen
parent6f58154e272c15f5a3cc1a8c326be451af245d54 (diff)
For Clang -fsanitize=vptr use -fvisibility-ms-compat in exernal/libepubgen too
...similarly to how it is used for other external libraries since f0aa1a78fb209310e8baef53c02f365fca518d11 "For Clang -fsanitize=vptr use -fvisibility-ms-compat, not -fvisibility=hidden". This caused CppunitTest_writerperfect_writer to fail now with -fsanitize=vptr after 7915f35d7fca5d0720d96954beaa97c00a2c3821 "EPUB export: implement doc/para open/close and text in doc handler", where additions to writerperfect/source/writer/EPUBExportFilter.cxx caused Library_wpftwriter to import more stuff from the libepubgen archive, which happend to make it pick up the (erroneously hidden) definition of _ZTIN10librevenge17RVNGTextInterfaceE from that archive, instead of from some other object/archive as happened before. Change-Id: I2b56df38d7225505ff993321598ddd51812d9de4