blob: c7ea76e6e18dd2f5ba54b6d8499c09f659ced36f [file] [log] [blame]
/**************************************************************
*
* 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.
*
*************************************************************/
#include "rtfimportfilter.hxx"
#include "../rtf/swparrtf.hxx"
#include <docsh.hxx>
#include <doc.hxx>
#include <pam.hxx>
#include <unotxdoc.hxx>
#include <swerror.h>
#include <cppuhelper/factory.hxx>
#include <comphelper/mediadescriptor.hxx>
#include <unotools/ucbstreamhelper.hxx>
#include <com/sun/star/frame/XDesktop.hpp>
#include <com/sun/star/frame/XComponentLoader.hpp>
using namespace ::comphelper;
using namespace ::com::sun::star;
using ::rtl::OUString;
using rtl::OUStringToOString;
RtfImportFilter::RtfImportFilter( const uno::Reference< lang::XMultiServiceFactory >& xMSF) :
m_xMSF( xMSF )
{
}
RtfImportFilter::~RtfImportFilter()
{
}
sal_Bool RtfImportFilter::filter( const uno::Sequence< beans::PropertyValue >& aDescriptor )
throw (uno::RuntimeException)
{
OSL_TRACE("%s", OSL_THIS_FUNC);
MediaDescriptor aMediaDesc = aDescriptor;
::uno::Reference< io::XInputStream > xInputStream =
aMediaDesc.getUnpackedValueOrDefault( MediaDescriptor::PROP_INPUTSTREAM(), uno::Reference< io::XInputStream >() );
SvStream* pStream = utl::UcbStreamHelper::CreateStream( xInputStream, sal_True );
if (!pStream)
return sal_False;
// get SwDoc*
uno::Reference< uno::XInterface > xIfc( m_xDstDoc, uno::UNO_QUERY );
SwXTextDocument *pTxtDoc = dynamic_cast< SwXTextDocument * >( xIfc.get() );
if (!pTxtDoc)
return sal_False;
SwDoc *pDoc = pTxtDoc->GetDocShell()->GetDoc();
if (!pDoc)
return sal_False;
// get SwPaM*
// NEEDSWORK should we care about partial imports? For now we just import
// the whole document
SwPaM aPam( pDoc->GetNodes().GetEndOfContent() );
aPam.SetMark();
aPam.Move( fnMoveBackward, fnGoDoc );
SwPaM *pCurPam = new SwPaM( *aPam.End(), *aPam.Start() );
String aURL;
OUString sTemp;
for ( sal_Int32 i = 0; i < aDescriptor.getLength(); i++ )
{
if( aDescriptor[i].Name == OUString(RTL_CONSTASCII_USTRINGPARAM("URL")) )
{
aDescriptor[i].Value >>= sTemp;
aURL = sTemp;
}
}
RtfReader aReader;
sal_Bool bRet = aReader.Read(pStream, *pDoc, aURL, *pCurPam) == 0;
delete pStream;
return bRet;
}
void RtfImportFilter::cancel( ) throw (uno::RuntimeException)
{
}
void RtfImportFilter::setTargetDocument( const uno::Reference< lang::XComponent >& xDoc )
throw (lang::IllegalArgumentException, uno::RuntimeException)
{
m_xDstDoc = xDoc;
}
//////////////////////////////////////////////////////////////////////////
// UNO helpers
//////////////////////////////////////////////////////////////////////////
OUString RtfImport_getImplementationName()
{
return OUString( RTL_CONSTASCII_USTRINGPARAM( IMPL_NAME_RTFIMPORT ) );
}
uno::Sequence< OUString > SAL_CALL RtfImport_getSupportedServiceNames() throw()
{
const OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.ImportFilter" ) );
const uno::Sequence< OUString > aSeq( &aServiceName, 1 );
return aSeq;
}
uno::Reference< uno::XInterface > SAL_CALL RtfImport_createInstance(const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception )
{
return (cppu::OWeakObject*) new RtfImportFilter( rSMgr );
}
/* vi:set shiftwidth=4 expandtab: */