| /************************************************************** | |
| * | |
| * 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 <com/sun/star/system/MailClientFlags.hpp> | |
| #include <com/sun/star/container/XNameAccess.hpp> | |
| #include <com/sun/star/beans/PropertyValue.hpp> | |
| #include <com/sun/star/beans/XPropertySet.hpp> | |
| #include <osl/file.hxx> | |
| #include <osl/thread.hxx> | |
| #include <rtl/bootstrap.hxx> | |
| #include <rtl/strbuf.hxx> | |
| #include <unistd.h> | |
| 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; | |
| } | |
| } |