/************************************************************** * * 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 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_shell.hxx" #include "syscmdmail.hxx" #include "cmdmailmsg.hxx" #include #include #include #include #include #include #include #include #include using com::sun::star::beans::PropertyValue; using com::sun::star::container::XNameAccess; using com::sun::star::system::XMailClient; using com::sun::star::system::XMailMessage; using rtl::OString; using rtl::OStringBuffer; using rtl::OUString; using rtl::OUStringToOString; using namespace com::sun::star::lang; using namespace com::sun::star::system::MailClientFlags; using namespace com::sun::star::uno; #define COMP_SERVICE_NAME "com.sun.star.system.SystemMailProvider" #define COMP_IMPL_NAME "com.sun.star.comp.system.unx.SystemMailProvider" namespace shell { namespace { static void escapeDoubleQuotes( OStringBuffer &rBuffer, const OUString &ustr, rtl_TextEncoding iEncoding ) { const OString rStr( OUStringToOString( ustr, iEncoding ) ); sal_Int32 nIndex = rStr.indexOf('"'); if ( nIndex == -1 ) rBuffer.append( rStr ); else { const sal_Char *pStart = rStr.getStr(); const sal_Char *pFrom = pStart; const sal_Int32 nLen = rStr.getLength(); sal_Int32 nPrev = 0;; do { rBuffer.append( pFrom, nIndex - nPrev ); rBuffer.append( RTL_CONSTASCII_STRINGPARAM( "\\\"" ) ); nIndex++; pFrom = pStart + nIndex; nPrev = nIndex; } while ( ( nIndex = rStr.indexOf( '"' , nIndex ) ) != -1 ); rBuffer.append( pFrom, nLen - nPrev ); } } } SystemCommandMail::SystemCommandMail( const Reference< XComponentContext >& xContext ) : SystemCommandMail_Base( m_aMutex ) , m_xContext( xContext ) { try { m_xConfigurationProvider.set( m_xContext->getServiceManager()->createInstanceWithContext( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationProvider") ), m_xContext ), UNO_QUERY ); } catch(...){} } SystemCommandMail::~SystemCommandMail() { m_xConfigurationProvider.clear(); m_xContext.clear(); } Reference< XMailClient > SAL_CALL SystemCommandMail::queryMailClient() throw ( RuntimeException ) { return Reference< XMailClient >( static_cast < cppu::OWeakObject * >( this ), UNO_QUERY ); } Reference< XMailMessage > SAL_CALL SystemCommandMail::createMailMessage() throw ( RuntimeException ) { return Reference< XMailMessage >( static_cast< cppu::OWeakObject *>( new CmdMailMsg() ), UNO_QUERY ); } void SAL_CALL SystemCommandMail::sendMailMessage( const Reference< XMailMessage >& xMailMessage, sal_Int32 /*aFlag*/ ) throw (IllegalArgumentException, Exception, RuntimeException) { osl::ClearableMutexGuard aGuard( m_aMutex ); Reference< XMultiServiceFactory > xConfigurationProvider = m_xConfigurationProvider; aGuard.clear(); if ( ! xMailMessage.is() ) { throw IllegalArgumentException( OUString(RTL_CONSTASCII_USTRINGPARAM( "No message specified" )), static_cast < XMailClient * > (this), 1 ); } if( ! xConfigurationProvider.is() ) { throw Exception( OUString(RTL_CONSTASCII_USTRINGPARAM( "Can not access configuration" )), static_cast < XMailClient * > (this) ); } OStringBuffer aBuffer; aBuffer.append("\""); OUString aProgramURL(RTL_CONSTASCII_USTRINGPARAM("$OOO_BASE_DIR/program/senddoc")); rtl::Bootstrap::expandMacros(aProgramURL); OUString aProgram; if ( osl::FileBase::E_None != osl::FileBase::getSystemPathFromFileURL(aProgramURL, aProgram)) { throw Exception( OUString(RTL_CONSTASCII_USTRINGPARAM("Cound not convert executable path")), static_cast < XMailClient * > (this)); } const rtl_TextEncoding iEncoding = osl_getThreadTextEncoding(); aBuffer.append(OUStringToOString(aProgram, iEncoding)); aBuffer.append("\" "); try { // Query XNameAccess interface of the org.openoffice.Office.Common/ExternalMailer // configuration node to retriece the users preferred email application. This may // transparently by redirected to e.g. the corresponding GConf setting in GNOME. OUString aConfigRoot = OUString( RTL_CONSTASCII_USTRINGPARAM( "org.openoffice.Office.Common/ExternalMailer" ) ); PropertyValue aProperty; aProperty.Name = OUString( RTL_CONSTASCII_USTRINGPARAM("nodepath" )); aProperty.Value = makeAny( aConfigRoot ); Sequence< Any > aArgumentList( 1 ); aArgumentList[0] = makeAny( aProperty ); Reference< XNameAccess > xNameAccess = Reference< XNameAccess > ( xConfigurationProvider->createInstanceWithArguments( OUString( RTL_CONSTASCII_USTRINGPARAM( "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( OUString( RTL_CONSTASCII_USTRINGPARAM("Program") ) ) >>= aMailer; if( aMailer.getLength() ) { // make sure we have a system path osl::FileBase::getSystemPathFromFileURL( aMailer, aMailer ); aBuffer.append("--mailclient "); aBuffer.append(OUStringToOString( aMailer, iEncoding )); aBuffer.append(" "); } #ifdef MACOSX else aBuffer.append("--mailclient Mail "); #endif } } catch( RuntimeException e ) { OSL_TRACE( "RuntimeException caught accessing configuration provider." ); OSL_TRACE( OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).getStr() ); throw e; } // Append body if set in the message OUString ustr = xMailMessage->getBody(); if ( ustr.getLength() > 0 ) { aBuffer.append("--body \""); escapeDoubleQuotes( aBuffer, ustr, iEncoding ); aBuffer.append("\" "); } // Append subject if set in the message ustr = xMailMessage->getSubject(); if ( ustr.getLength() > 0 ) { aBuffer.append("--subject \""); escapeDoubleQuotes( aBuffer, ustr, iEncoding ); aBuffer.append("\" "); } // Append originator if set in the message if ( xMailMessage->getOriginator().getLength() > 0 ) { aBuffer.append("--from \""); aBuffer.append(OUStringToOString(xMailMessage->getOriginator(), iEncoding)); aBuffer.append("\" "); } // Append receipient if set in the message if ( xMailMessage->getRecipient().getLength() > 0 ) { aBuffer.append("--to \""); aBuffer.append(OUStringToOString(xMailMessage->getRecipient(), iEncoding)); aBuffer.append("\" "); } // Append carbon copy receipients set in the message Sequence< OUString > aStringList = xMailMessage->getCcRecipient(); sal_Int32 n, nmax = aStringList.getLength(); for ( n = 0; n < nmax; n++ ) { aBuffer.append("--cc \""); aBuffer.append(OUStringToOString(aStringList[n], iEncoding)); aBuffer.append("\" "); } // Append blind carbon copy receipients set in the message aStringList = xMailMessage->getBccRecipient(); nmax = aStringList.getLength(); for ( n = 0; n < nmax; n++ ) { aBuffer.append("--bcc \""); aBuffer.append(OUStringToOString(aStringList[n], iEncoding)); aBuffer.append("\" "); } // Append attachments set in the message aStringList = xMailMessage->getAttachement(); nmax = aStringList.getLength(); for ( n = 0; n < nmax; n++ ) { OUString aSystemPath; if ( osl::FileBase::E_None == osl::FileBase::getSystemPathFromFileURL(aStringList[n], aSystemPath) ) { aBuffer.append("--attach \""); aBuffer.append(OUStringToOString(aSystemPath, iEncoding)); aBuffer.append("\" "); } } OString cmd = aBuffer.makeStringAndClear(); if ( 0 != pclose(popen(cmd.getStr(), "w")) ) { throw ::com::sun::star::uno::Exception( OUString(RTL_CONSTASCII_USTRINGPARAM( "No mail client configured" )), static_cast < XMailClient * > (this) ); } } OUString SAL_CALL SystemCommandMail::getImplementationName( ) throw( RuntimeException ) { return getImplementationName_static(); } sal_Bool SAL_CALL SystemCommandMail::supportsService( const OUString& ServiceName ) throw( RuntimeException ) { Sequence < OUString > SupportedServicesNames = getSupportedServiceNames_static(); for ( sal_Int32 n = SupportedServicesNames.getLength(); n--; ) if (SupportedServicesNames[n].compareTo(ServiceName) == 0) return sal_True; return sal_False; } Sequence< OUString > SAL_CALL SystemCommandMail::getSupportedServiceNames() throw( RuntimeException ) { return getSupportedServiceNames_static(); } Reference< XInterface > SystemCommandMail::Create( const Reference< XComponentContext > &xContext) { return Reference< XInterface >( static_cast< cppu::OWeakObject *>( new SystemCommandMail( xContext ) ) ); } OUString SystemCommandMail::getImplementationName_static() { return OUString( RTL_CONSTASCII_USTRINGPARAM( COMP_IMPL_NAME ) ); } Sequence< OUString > SystemCommandMail::getSupportedServiceNames_static() { Sequence< OUString > aRet(1); aRet[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( COMP_SERVICE_NAME ) ); return aRet; } }