/************************************************************************* * * $RCSfile: cmdmailsuppl.cxx,v $ * * $Revision: 1.9 $ * * last change: $Author: rt $ $Date: 2004-10-22 08:14:46 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses * * - GNU Lesser General Public License Version 2.1 * - Sun Industry Standards Source License Version 1.1 * * Sun Microsystems Inc., October, 2000 * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2000 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library 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 for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * * Sun Industry Standards Source License Version 1.1 * ================================================= * The contents of this file are subject to the Sun Industry Standards * Source License Version 1.1 (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.openoffice.org/license.html. * * Software provided under this License is provided on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. * See the License for the specific provisions governing your rights and * obligations concerning the Software. * * The Initial Developer of the Original Code is: Sun Microsystems, Inc. * * Copyright: 2000 by Sun Microsystems, Inc. * * All Rights Reserved. * * Contributor(s): _______________________________________ * * ************************************************************************/ //------------------------------------------------------------------------ // includes //------------------------------------------------------------------------ #ifndef _OSL_DIAGNOSE_H_ #include #endif #ifndef _OSL_THREAD_H_ #include #endif #ifndef _OSL_PROCESS_H_ #include #endif #ifndef _OSL_FILE_HXX_ #include #endif #ifndef _RTL_STRBUF_HXX_ #include #endif #ifndef _CMDMAILSUPPL_HXX_ #include "cmdmailsuppl.hxx" #endif #ifndef _CMDMAILMSG_HXX_ #include "cmdmailmsg.hxx" #endif #ifndef _COM_SUN_STAR_SYSTEM_SIMPLEMAILCLIENTFLAGS_HPP_ #include #endif #ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_ #include #endif #ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_ #include #endif #ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_ #include #endif #ifndef _COM_SUN_STAR_UNO_XCOMPONENTCONTEXT_HPP_ #include #endif #include #include #include //------------------------------------------------------------------------ // namespace directives //------------------------------------------------------------------------ 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::container::XNameAccess; using com::sun::star::container::NoSuchElementException; using rtl::OUString; using rtl::OUStringToOString; using rtl::OString; using rtl::OStringBuffer; using osl::MutexGuard; 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; //------------------------------------------------------------------------ // defines //------------------------------------------------------------------------ #define COMP_IMPL_NAME "com.sun.star.comp.system.SimpleCommandMail2" //------------------------------------------------------------------------ // helper functions //------------------------------------------------------------------------ namespace // private { Sequence< OUString > SAL_CALL Component_getSupportedServiceNames() { Sequence< OUString > aRet(1); aRet[0] = OUString::createFromAscii("com.sun.star.system.SimpleCommandMail"); return aRet; } } // end private namespace //------------------------------------------------- // //------------------------------------------------- CmdMailSuppl::CmdMailSuppl( const Reference< XComponentContext >& xContext ) : WeakImplHelper3< XSimpleMailClientSupplier, XSimpleMailClient, XServiceInfo >() { Reference< XMultiComponentFactory > xServiceManager = xContext->getServiceManager(); if ( xServiceManager.is() ) { m_xConfigurationProvider = Reference< XMultiServiceFactory > ( xServiceManager->createInstanceWithContext( OUString::createFromAscii( "com.sun.star.configuration.ConfigurationProvider" ), xContext ), UNO_QUERY ); } } //------------------------------------------------- // XSimpleMailClientSupplier //------------------------------------------------- Reference< XSimpleMailClient > SAL_CALL CmdMailSuppl::querySimpleMailClient( ) throw (RuntimeException) { return static_cast < XSimpleMailClient * > (this); } //------------------------------------------------ // XSimpleMailClient //------------------------------------------------ Reference< XSimpleMailMessage > SAL_CALL CmdMailSuppl::createSimpleMailMessage( ) throw (::com::sun::star::uno::RuntimeException) { return Reference< XSimpleMailMessage >( new CmdMailMsg( ) ); } //------------------------------------------------ // XSimpleMailClient //------------------------------------------------ void SAL_CALL CmdMailSuppl::sendSimpleMailMessage( const Reference< XSimpleMailMessage >& xSimpleMailMessage, sal_Int32 aFlag ) throw (IllegalArgumentException, Exception, RuntimeException) { if ( ! xSimpleMailMessage.is() ) { throw ::com::sun::star::lang::IllegalArgumentException( OUString(RTL_CONSTASCII_USTRINGPARAM( "No message specified" )), static_cast < XSimpleMailClient * > (this), 1 ); } if( ! m_xConfigurationProvider.is() ) { throw ::com::sun::star::uno::Exception( OUString(RTL_CONSTASCII_USTRINGPARAM( "Can not access configuration" )), static_cast < XSimpleMailClient * > (this) ); } OStringBuffer aBuffer; OUString aProgramURL; if ( osl_Process_E_None != osl_getExecutableFile(&aProgramURL.pData) ) { throw ::com::sun::star::uno::Exception( OUString(RTL_CONSTASCII_USTRINGPARAM("Cound not determine executable path")), static_cast < XSimpleMailClient * > (this)); } OUString aProgram; if ( FileBase::E_None != FileBase::getSystemPathFromFileURL(aProgramURL, aProgram)) { throw ::com::sun::star::uno::Exception( OUString(RTL_CONSTASCII_USTRINGPARAM("Cound not convert executable path")), static_cast < XSimpleMailClient * > (this)); } // The mail client launchers are expected to be in the same directory as the main // executable, so prefixing the launchers with the path of the executable including // the last slash OString aTmp = OUStringToOString(aProgram, osl_getThreadTextEncoding()); sal_Int32 nIndex = aTmp.lastIndexOf('/'); if (nIndex > 0) aBuffer.append(aTmp.copy(0, nIndex+1)); aBuffer.append("senddoc "); 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::createFromAscii( "nodepath" ); aProperty.Value = makeAny( aConfigRoot ); Sequence< Any > aArgumentList( 1 ); aArgumentList[0] = makeAny( aProperty ); Reference< XNameAccess > xNameAccess = Reference< XNameAccess > ( m_xConfigurationProvider->createInstanceWithArguments( OUString::createFromAscii( "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::createFromAscii( "Program" ) ) >>= aMailer; if( aMailer.getLength() ) { // make sure we have a system path FileBase::getSystemPathFromFileURL( aMailer, aMailer ); aBuffer.append("--mailclient "); aBuffer.append(OUStringToOString( aMailer, osl_getThreadTextEncoding() )); aBuffer.append(" "); } } } catch( RuntimeException e ) { m_xConfigurationProvider.clear(); OSL_TRACE( "RuntimeException caught accessing configuration provider." ); OSL_TRACE( OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).getStr() ); throw e; } // Append originator if set in the message if ( xSimpleMailMessage->getOriginator().getLength() > 0 ) { aBuffer.append("--from \""); aBuffer.append(OUStringToOString(xSimpleMailMessage->getOriginator(), osl_getThreadTextEncoding())); aBuffer.append("\" "); } // Append receipient if set in the message if ( xSimpleMailMessage->getRecipient().getLength() > 0 ) { aBuffer.append("--to \""); aBuffer.append(OUStringToOString(xSimpleMailMessage->getRecipient(), osl_getThreadTextEncoding())); aBuffer.append("\" "); } // Append carbon copy receipients set in the message Sequence< OUString > aStringList = xSimpleMailMessage->getCcRecipient(); sal_Int32 n, nmax = aStringList.getLength(); for ( n = 0; n < nmax; n++ ) { aBuffer.append("--cc \""); aBuffer.append(OUStringToOString(aStringList[n], osl_getThreadTextEncoding())); aBuffer.append("\" "); } // Append blind carbon copy receipients set in the message aStringList = xSimpleMailMessage->getBccRecipient(); nmax = aStringList.getLength(); for ( n = 0; n < nmax; n++ ) { aBuffer.append("--bcc \""); aBuffer.append(OUStringToOString(aStringList[n], osl_getThreadTextEncoding())); aBuffer.append("\" "); } // Append subject if set in the message if ( xSimpleMailMessage->getSubject().getLength() > 0 ) { aBuffer.append("--subject \""); aBuffer.append(OUStringToOString(xSimpleMailMessage->getSubject(), osl_getThreadTextEncoding())); aBuffer.append("\" "); } // 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 \""); aBuffer.append(OUStringToOString(aSystemPath, RTL_TEXTENCODING_UTF8)); 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 < XSimpleMailClient * > (this) ); } } // ------------------------------------------------- // XServiceInfo // ------------------------------------------------- OUString SAL_CALL CmdMailSuppl::getImplementationName( ) throw( RuntimeException ) { return OUString::createFromAscii( COMP_IMPL_NAME ); } // ------------------------------------------------- // XServiceInfo // ------------------------------------------------- sal_Bool SAL_CALL CmdMailSuppl::supportsService( const OUString& ServiceName ) throw( RuntimeException ) { Sequence < OUString > SupportedServicesNames = Component_getSupportedServiceNames(); for ( sal_Int32 n = SupportedServicesNames.getLength(); n--; ) if (SupportedServicesNames[n].compareTo(ServiceName) == 0) return sal_True; return sal_False; } // ------------------------------------------------- // XServiceInfo // ------------------------------------------------- Sequence< OUString > SAL_CALL CmdMailSuppl::getSupportedServiceNames( ) throw( RuntimeException ) { return Component_getSupportedServiceNames(); }